Veo bloques de código todo el tiempo donde la gente lo complica innecesariamente. ¿Cuál es la razón para esto?
Ejemplo:
const greet = function (greeting) { return function (name) { console.log(`${greeting} ${name}`) } } const greeterHey = greet('Hey'); greeterHey('test')en lugar de algo como esto
const greet = function (greeting, name) { console.log(`${greeting} ${name}`) } const greeterHey = greet('Hey', 'test');¿Que es todo esto? ¿Tiene algo que ver con el hecho de que cuando editas el bloque de código más tarde, es más fácil?
Probablemente sea un ejemplo de curry de funciones o función de orden superior, una técnica en el Paradigma de Programación Funcional. Curryinng es, en mi opinión, probablemente lo más importante en la programación funcional con Haskell, por ejemplo.
El ejemplo es probablemente solo para una demostración fácil, sin embargo, la técnica es bastante poderosa si se usa en las situaciones correctas.
Al convertir la función de parámetros múltiples en cadenas de funciones de un argumento, puede crear lo que llamé "función de nicho"
const greet = function (greeting) { return function (name) { console.log(`${greeting}, ${name}`) } } // greetWithHello kinda retains the same logic as `greet`, but now has become more "niche" // because you can only greet with "Hello" const greetWithHello = greet("Hello"); //greetWithHello is a FUNCTION greetWithHello("Ben") // "Hello, Ben" greetWitHello("Bob") // "Hello, Bob" const greetWithBadaboom = greet("Badaboom") Como puede imaginar, en lugar de seguir escribiendo greet("Hello", "Ben") y greet("Hello", "Bob") , ahora tiene una función greetWithHello más reutilizable.
Comparado esto con la versión sin curry
const greet2(phrase, name) { console.log(`${phrase}, ${name}`) } const greetWithHello2 = (name) => { return greet2("Hello", name) } const greetWithBadaboom2 = (name) => { return greet2("Badaboom", name) }Como puede ver, mucho menos componible y legible que la versión con curry, y esto es solo para 2 parámetros. Es por esto que los patrones de programación funcional pueden ser muy útiles cuando se trabaja con funciones.
Solo sé esto de la universidad y nunca lo usé, pero supongo que las bibliotecas con funciones de orden superior pueden utilizar esto
Esto está relacionado con algo llamado "cierres" que, en resumen, permite crear funciones que devuelven funciones, y esas conservan los valores que proporcionaste, variables o constantes por igual.
En otros lenguajes, las variables o constantes creadas dentro del alcance/bloque de una función solo viven durante la ejecución de dicha función. En JavaScript, al usar esta sintaxis, se crea un "entorno léxico" y la función devuelta también puede acceder a valores fuera de su propio ámbito/entorno.
Como se indicó en las otras respuestas, es una característica muy útil cuando se usa correctamente en funciones de orden superior.
Hay algunos ejemplos y una explicación más clara en la página de MDN sobre cierres:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures