Es ist eigentlich nicht so kompliziert, wenn man es Schritt für Schritt durcharbeitet. Lassen Sie uns von innen heraus arbeiten. Berufung:
three()
Ohne Parameter bedeutet dies, dass Sie einen undefinierten Wert als Funktion übergeben. Es ist also dasselbe wie zu sagen:
makeNum(3, undefined)
Wenn makeNum erkennt, dass func undefiniert ist, gibt es num zurück, was 3 ist.
Also haben wir dies auf Folgendes reduziert:
eight(minus(3))
Nun wollen wir sehen wie
minus(3)
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:
eight(function(left){
return left - 3;
})
Nun wollen wir sehen, wie dies ausgewertet wird. acht wird aufgerufen, wobei der func-Parameter diese Funktion ist:
function(left){
return left - 3;
}
Es übergibt dann 8 und diese Funktion an makeNum, wenn es heißt:
makeNum(8, func)
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:
8 - 3
zurück zur Achtfunktion. Die Acht-Funktion empfängt diesen Wert und gibt ihn dann zurück. Also haben wir dies auf Folgendes reduziert:
5
welches in der Konsole angemeldet wird.