Eu estava procurando uma solução para um quebra-cabeça sobre códigos de guerra e não entendo por que isso funciona. Como o minus () está funcionando?
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
fonte
fonte
Respostas:
É um pouco complicado. :-)
console.log(eight(minus(three())));
é executado de dentro para fora, então vamos segui-lo:three()
- chamamakeNum(3, undefined)
e retorna o que retorna.makeNum(3, undefined)
retorna3
, então esse é o valor de retorno.minus(3)
- chamaminus
, passando3
comoright
.minus
retorna uma nova função que fecharight
.eight(...)
- chamamakeNum(8, fnFromMinus)
ondefnFromMinus
está a função retornada porminus(3)
.makeNum(8, fnFromMinus)
fazfnFromMinus
, passando8
comoleft
.fnFromMinus
retorna o resultado deleft - right
(lembre-right
se3
,fnFromMinus
fechado).Desde que
8 - 3
é5
, o resultado final é5
, queconsole.log
retorna.Aqui está uma versão instrumentada:
Mostrar snippet de código
fonte
Na verdade, não é tão complicado se você trabalhar com isso passo a passo. Vamos trabalhar de dentro para fora. A ligar:
sem um parâmetro significa que você está passando um valor indefinido como func. Portanto, é o mesmo que dizer:
Quando o makeNum vê que func é indefinida, ele retorna num, que é 3.
Então, reduzimos isso para:
Agora vamos ver como
avalia. menos vê que o parâmetro que você forneceu é 3, então ele retorna uma função que pode aceitar um parâmetro "esquerdo" e subtrair os 3 que já fornecemos a ele. NÃO é executado. Ele fica lá, esperando para ser chamado com um parâmetro "left" para que ele possa subtrair 3 dele.
Então, reduzimos isso para:
Agora vamos ver como isso avalia. oito é chamado com o parâmetro func sendo esta função:
Em seguida, passa 8 e essa função para makeNum quando diz:
makeNum vê que func foi fornecida (e, portanto, não é indefinida) e retorna func (num) de volta à função oito, que é o mesmo que passar:
de volta à função oito. A função oito recebe esse valor e depois o retorna. Então, reduzimos isso para:
que é registrado no console.
fonte
minus
retorna uma nova função para cada chamada com os parâmetros passados para ela sendo capturados. Quando a função retornada é chamada, ela pode fazer referência aos parâmetros passados quando chamados, além de quaisquer parâmetros passados para ela. Esta é uma maneira de curry funções em JavaScript.fonte
Este código é um exemplo de funções de ordem superior em linguagens de programação funcional como js. As funções Javascript são tratadas como objetos e também podem ser passadas e retornadas.
minus
está retornando uma função anônima ( uma função sem nome definido ) basicamente como:Essa função, quando passada para,
eight
é chamada como afunc(8)
qual, então, dá resultado como5
fonte
Outra maneira de ver isso - você pode reescrever esta linha:
Como:
fonte