2017-02-12 10 views
0

Version 1So rufen Sie eine Javascript-Funktion mit Schließung auf?

function sayHello2(name){ 
 
    var text='Hello'+name; 
 
    var say=function(){ 
 
    console.log(text); 
 
    
 
    }; 
 
return say; 
 
    
 
} 
 

 
var say2=sayHello2("David"); 
 
say2();

Version 2

function sayHello2(name){ 
 
    var text='Hello'+name; 
 
    var say=function(){ 
 
    console.log(text); 
 
    
 
    }; 
 
return say; 
 
    
 
} 
 

 
sayHello2("David")();

Fragen:

  1. Warum in Version eins, wenn Sie var say2 verwenden, um sayHello2 aufzurufen, müssen Sie keine weiteren leeren Klammern hinzufügen?
  2. Wenn ich die Zeile zurücknehmen sage sagen, wird die Fehlermeldung sagen, sayHello2 ist keine Funktion, warum?
  3. Warum ist der Punkt von say2(); (die letzte Zeile in Version2)? Wenn ich diese Zeile lösche, ändert sich nichts, "HelloDavid" wird weiterhin protokolliert.
+0

Der einzige Unterschied ist, dass Sie den ersten Schritt in eine Variable speichern und dann aufrufen. Der zweite verwendet nur keine Variable. – epascarello

Antwort

4
  1. 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.

  2. Wenn es keine return Anweisung gibt, dann gibt sayHello2() zurück.

  3. 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.

+0

Aber was ist der Zweck von say2() ;? – user132522

+0

Ich bin immer noch nicht klar, was Sie gesagt haben "Das zweite Beispiel verwendet sofort den Rückgabewert von sayHello2(), um diese zurückgegebene Funktion aufzurufen.". Was zurückgegebene Funktion? Und was ist der Rückgabewert? – user132522

+0

@ user132522 'sayHello2()' gibt einen Verweis auf eine ** Funktion ** zurück. Diese Referenz wird in der Variablen 'say2' gespeichert, so dass' say2() 'einen ** Aufruf ** an diese Funktion macht. – Pointy

Verwandte Themen