Ich habe nach einer Lösung für ein Rätsel mit Codewars gesucht und verstehe nicht, warum es funktioniert. Wie funktioniert 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
quelle
quelle
Antworten:
Es ist ein bisschen kompliziert. :-)
console.log(eight(minus(three())));
wird von innen nach außen ausgeführt, also folgen wir ihm durch:three()
- ruft aufmakeNum(3, undefined)
und gibt zurück, was es zurückgibt.makeNum(3, undefined)
gibt zurück3
, das ist also der Rückgabewert.minus(3)
- Anrufeminus
, Weitergabe3
alsright
.minus
Gibt eine neue Funktion zurück, die geschlossen wirdright
.eight(...)
- ruft auf,makeNum(8, fnFromMinus)
wofnFromMinus
sich die Funktion befindet, die von zurückgegeben wurdeminus(3)
.makeNum(8, fnFromMinus)
tutfnFromMinus
,8
als übergebenleft
.fnFromMinus
gibt das Ergebnisleft - right
(das erinnernright
ist3
,fnFromMinus
über sie geschlossen).Da
8 - 3
ist5
, ist das Endergebnis5
, dasconsole.log
zurückkehrt.Hier ist eine instrumentierte Version:
Code-Snippet anzeigen
quelle
Es ist eigentlich nicht so kompliziert, wenn man es Schritt für Schritt durcharbeitet. Lassen Sie uns von innen heraus arbeiten. Berufung:
Ohne Parameter bedeutet dies, dass Sie einen undefinierten Wert als Funktion übergeben. Es ist also dasselbe wie zu sagen:
Wenn makeNum erkennt, dass func undefiniert ist, gibt es num zurück, was 3 ist.
Also haben wir dies auf Folgendes reduziert:
Nun wollen wir sehen wie
bewertet. minus sieht, dass der von Ihnen angegebene Parameter 3 ist, gibt also eine Funktion zurück, die einen "linken" Parameter akzeptieren und die 3, die wir bereits bereitgestellt haben, von diesem subtrahieren kann. Es wird NICHT ausgeführt. Es sitzt einfach da und wartet darauf, mit einem "linken" Parameter aufgerufen zu werden, damit es 3 davon subtrahieren kann.
Also haben wir dies auf Folgendes reduziert:
Nun wollen wir sehen, wie dies ausgewertet wird. acht wird aufgerufen, wobei der func-Parameter diese Funktion ist:
Es übergibt dann 8 und diese Funktion an makeNum, wenn es heißt:
makeNum erkennt dann, dass func bereitgestellt wurde (und daher nicht undefiniert ist) und gibt func (num) an die Acht-Funktion zurück, was dem Übergeben entspricht:
zurück zur Achtfunktion. Die Acht-Funktion empfängt diesen Wert und gibt ihn dann zurück. Also haben wir dies auf Folgendes reduziert:
welches in der Konsole angemeldet wird.
quelle
minus
Gibt für jeden Aufruf eine neue Funktion zurück, wobei die an ihn übergebenen Parameter erfasst werden. Wenn die zurückgegebene Funktion aufgerufen wird, kann sie zusätzlich zu den an sie übergebenen Parametern auf die beim Aufruf übergebenen Parameter verweisen. Dies ist eine Möglichkeit, Funktionen in JavaScript zu curry.quelle
Dieser Code ist ein Beispiel für Funktionen höherer Ordnung in funktionalen Programmiersprachen wie js. Javascript-Funktionen werden als Objekte behandelt und können auch übergeben und zurückgegeben werden.
minus
gibt eine anonyme Funktion ( eine Funktion ohne definierten Namen ) im Grunde zurück als:Wenn diese Funktion an übergeben wird,
eight
wird sie als aufgerufen,func(8)
was dann das Ergebnis als ergibt5
quelle
Eine andere Sichtweise - Sie können diese Zeile neu schreiben:
Wie:
quelle