In beiden Proben von Code sind zwei Funktionsaufrufe gemacht. Der Unterschied zwischen dem ersten und dem zweiten ist, dass in dem ersten Abtastwert das Ergebnis des ersten Funktionsaufrufs in say2
gespeichert wird, bevor der zweite Funktionsaufruf erfolgt. Das zweite Beispiel verwendet sofort den Rückgabewert von sayHello2()
, um die zurückgegebene Funktion aufzurufen.
Wenn es keine return
Anweisung gibt, dann gibt sayHello2()
zurück.
Der Anspruch auf diese Frage, dass das Entfernen der say2();
Zeile das Verhalten nicht ändert, ist falsch. Wenn Sie nicht say2()
aufrufen, wird nichts protokolliert.
Blick auf sayHello2()
:
function sayHello2(name){
// Initialize the text that will be logged
var text='Hello'+name;
// Create the function that will log the message
var say=function(){
console.log(text);
};
// Return the logging function
return say;
}
Die sayHello2()
Funktion gibt einen Verweis auf diese kleine Funktion, die console.log()
nennt. Da Funktionen Objektwerte in JavaScript sind, funktioniert eine Referenz auf eine Funktion ebenso wie jede andere Art von Wert und kann in einer Variablen gespeichert oder in einem Ausdruck verwendet werden.
Beachten Sie, dass, wenn die Logging-Funktion erstellt wird, das mit einer var
initailization getan:
var say=function(){
console.log(text);
};
, die im Wesentlichen ist die gleiche Sache, die auf die Variable say2
passiert:
var say2=sayHello2("David");
außer dass hier, auf der rechten Seite des =
Zeichens gibt es eine Funktion Anruf anstelle einer Funktionsinstanziierung.
Die Aussage
say2();
deshalb ruft die kleine Logging-Funktion, die aus dem Aufruf von sayHello2()
zurückgegeben wurde.
Das zweite Codebeispiel macht das Gleiche:
sayHello2("David")();
außer
, dass es keine Zwischenlagerung der zurückgegebenen Funktionsreferenz. Stattdessen wird die Referenz sofort für den zweiten Funktionsaufruf verwendet.
In der ersten Version zählt die Funktion Anrufe:
var say2 = sayHello2("David"); // First function call
say2(); // Second function call
In der zweiten Version:
// First // Second
sayHello2("David")();
In JavaScript ein Ausdruck der Form
something()
immer bedeutet, "interpretiere something
als Referenz auf eine Funktion und rufe es auf (passiere keinen Parameter ters). " Wenn something
kein Verweis auf eine Funktion ist, erhalten Sie eine Ausnahme. In Version 2 lautet unsere something
also sayHello2("David")
. Da der zweite Satz leerer Klammern dahinter steht, heißt das, dass wir JavaScript anweisen, einen weiteren Funktionsaufruf zu machen.
Der einzige Unterschied ist, dass Sie den ersten Schritt in eine Variable speichern und dann aufrufen. Der zweite verwendet nur keine Variable. – epascarello