Je cherchais une solution à un puzzle sur les guerres de codes et je ne comprends pas pourquoi cela fonctionne. Comment fonctionne moins ()?
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
la source
la source
Réponses:
C'est un peu compliqué. :-)
console.log(eight(minus(three())));
est exécuté de l'intérieur vers l'extérieur, nous allons donc le suivre à travers:three()
- appellemakeNum(3, undefined)
et retourne ce qu'il retourne.makeNum(3, undefined)
renvoie3
, c'est donc la valeur de retour.minus(3)
- appelsminus
, passant3
commeright
.minus
renvoie une nouvelle fonction qui se fermeright
.eight(...)
- appellemakeNum(8, fnFromMinus)
oùfnFromMinus
est la fonction qui a été retournée parminus(3)
.makeNum(8, fnFromMinus)
faitfnFromMinus
, passant8
commeleft
.fnFromMinus
renvoie le résultat deleft - right
(rappelez - vous queright
est3
,fnFromMinus
fermé au - dessus).Depuis
8 - 3
est5
, le résultat final est5
, quiconsole.log
retours.Voici une version instrumentée:
Afficher l'extrait de code
la source
En fait, ce n'est pas si compliqué si vous travaillez pas à pas. Travaillons de l'intérieur. Appel:
sans paramètre signifie que vous passez une valeur indéfinie comme func. C'est donc la même chose que de dire:
Lorsque makeNum voit que func n'est pas défini, il renvoie num, qui est 3.
Nous avons donc réduit cela à:
Voyons maintenant comment
évalue. moins voit que le paramètre que vous avez fourni est 3, donc il retourne une fonction qui peut accepter un paramètre "gauche" et soustraire le 3 que nous avons déjà fourni. Il ne s'exécute PAS. Il se trouve juste là, attendant d'être appelé avec un paramètre "gauche" pour pouvoir en soustraire 3.
Nous avons donc réduit cela à:
Voyons maintenant comment cela évalue. huit est appelé avec le paramètre func étant cette fonction:
Il passe ensuite 8 et cette fonction à makeNum quand il dit:
makeNum voit alors que func a été fourni (et n'est donc pas indéfini) et renvoie func (num) à la fonction huit, ce qui revient à passer:
retour à la fonction huit. La fonction huit reçoit cette valeur, puis la renvoie. Nous avons donc réduit cela à:
qui est enregistré dans la console.
la source
minus
renvoie une nouvelle fonction pour chaque appel avec les paramètres qui lui sont transmis en cours de capture. Lorsque la fonction retournée est appelée, elle peut référencer les paramètres passés lors de l'appel, en plus de tous les paramètres qui lui sont passés. C'est une façon de curryer des fonctions en JavaScript.la source
Ce code est un exemple de fonctions d'ordre supérieur dans les langages de programmation fonctionnels comme js. Les fonctions Javascript sont traitées comme des objets et peuvent également être transmises et renvoyées.
minus
renvoie une fonction anonyme ( une fonction sans nom défini ) essentiellement comme:Cette fonction, lorsqu'elle est passée à,
eight
est appelée as,func(8)
qui donne ensuite le résultat5
la source
Une autre façon de voir les choses - vous pouvez réécrire cette ligne:
Comme:
la source