Estaba buscando una solución para un rompecabezas en codewars y no entiendo por qué funciona. ¿Cómo está funcionando minus ()?
function makeNum(num, func) {
if (func === undefined) {
return num;
} else {
return func(num);
}
}
function three(func) {
return makeNum(3, func);
}
function eight(func) {
return makeNum(8, func);
}
function minus(right) {
return function(left) {
return left - right;
};
}
console.log(eight(minus(three()))); // will log out 5
javascript
TypeleveN
fuente
fuente
Respuestas:
Es un poco complicado :-)
console.log(eight(minus(three())));
se ejecuta desde adentro hacia afuera, así que vamos a seguirlo:three()
- llamamakeNum(3, undefined)
y devuelve lo que devuelve.makeNum(3, undefined)
devuelve3
, entonces ese es el valor de retorno.minus(3)
- llamadasminus
, pasando3
comoright
.minus
devuelve una nueva función que se cierraright
.eight(...)
- llama amakeNum(8, fnFromMinus)
dóndefnFromMinus
está la función que devolvióminus(3)
.makeNum(8, fnFromMinus)
hacefnFromMinus
, pasando8
comoleft
.fnFromMinus
devuelve el resultado deleft - right
(recuerde queright
es3
,fnFromMinus
cerrado sobre él).Como
8 - 3
es5
, el resultado final es5
, queconsole.log
regresa.Aquí hay una versión instrumentada:
Mostrar fragmento de código
fuente
En realidad, no es tan complicado si lo superas paso a paso. Trabajemos de adentro hacia afuera. Vocación:
sin un parámetro significa que está pasando un valor indefinido como func. Entonces es lo mismo que decir:
Cuando makeNum ve que func no está definido, devuelve num, que es 3.
Así que hemos reducido esto a:
Ahora veamos como
evalúa minus ve que el parámetro que ha proporcionado es 3, por lo que devuelve una función que puede aceptar un parámetro "izquierdo" y restar los 3 que ya le hemos proporcionado. NO se ejecuta. Simplemente se queda allí, esperando que lo llamen con un parámetro "izquierdo" para que pueda restarle 3.
Así que hemos reducido esto a:
Ahora veamos cómo se evalúa esto. ocho se llama con el parámetro func siendo esta función:
Luego pasa 8 y esta función a makeNum cuando dice:
makeNum luego ve que se ha proporcionado func (y por lo tanto no está indefinido) y devuelve func (num) a la función ocho, que es lo mismo que pasar:
volviendo a la octava función. La función ocho recibe ese valor y luego lo devuelve. Así que hemos reducido esto a:
que se registra en la consola.
fuente
minus
devuelve una nueva función para cada invocación con los parámetros pasados que se capturan. Cuando se llama a la función devuelta, puede hacer referencia a los parámetros pasados cuando se llama, además de cualquier parámetro que se le pase. Esta es una forma de curry funciones en JavaScript.fuente
Este código es un ejemplo de funciones de orden superior en lenguajes de programación funcionales como js. Las funciones de Javascript se tratan como objetos y también se pueden pasar y devolver.
minus
está devolviendo una función anónima ( una función sin nombre definido ) básicamente como:Esta función cuando se pasa a
eight
se llama comofunc(8)
que luego da resultado como5
fuente
Otra forma de verlo: puede volver a escribir esta línea:
Como:
fuente