2016-08-03 13 views
5

Ich lese "Eloquent JavaScript". Kapitel 3 führt das Konzept "Closure" ein und gibt Ihnen ein paar Beispiele. Einer davon ist der nächste:Kann mir jemand den Ablauf dieser JavaScript-Funktion erklären? (Closure Konzept)

function multiplier(factor) { 
    return function(number) { 
     return number * factor; 
    }; 
} 

var twice = multiplier(2); 
console.log(twice(5)); 
// → 10 

Ich glaube, ich habe das Konzept verstanden. Wenn ich zuerst console.log(twice) ausführe, da die Variable number nicht definiert ist, was ich bekomme, ist [Function]. Was ich nicht verstehe ist, wie twice(5) funktioniert. Warum wird die lokale Variable number mit dem Wert 5 initialisiert?

Auch warum, wenn ich console.log(multiplier(2,5)) ausführen, bekomme ich nicht 10 als Ergebnis?

Danke.

+0

@Sidenote: Vielen Dank! –

+0

Es ist eine [Curry-Funktion] (http://stackoverflow.com/questions/2272902/make-this-syntax-possible-var-a-add23-5) – ftor

Antwort

6

Da multiplier eine Funktion zurückgibt, entspricht twice der zurückgegebenen Funktion, NICHT der multiplier Funktion.

Wenn jedoch multiplier aufgerufen wird, wird die factor Variable übergeben und innerhalb der zurückgegebenen Funktion verwendet.

So macht es leichter zu verstehen, die Ansicht, dass twice ist im Grunde:

var twice = function(number) { 
    return number * 2; 
}; 

Wo factor durch den Wert ersetzt wurden Sie in übergeben, wenn multiplier(2) aufrufen.


Ich glaube, ich das Konzept verstanden. Wenn ich zuerst console.log(twice) ausführen, da Variable Nummer nicht definiert ist, was ich bekomme, ist [Function].

Wenn Sie console.log(twice) Sie anrufen, nicht eigentlich die Funktion twice, Sie den Wert es einfach anzumelden. So ist die Ausgabe von [Function] nicht, weil number nicht definiert ist, ist es, weil Sie die tatsächliche Funktion und nicht das Ergebnis davon ausgeben.


Auch, warum, wenn ich console.log(multiplier(2,5)) ausführen Ich habe nicht 10 als Ergebnis?

Hier rufen Sie die multiplier von 2 Argumente bereitstellt, wenn Sie nur die Funktion definiert haben einen Parameter (factor) zu akzeptieren. In Javascript führt dies nicht zu einem Fehler, aber Sie erhalten nur den ersten Wert in factor (factor = 2) zugeordnet.

Hinweis: Es gibt Möglichkeiten, noch für den Zugriff auf alle Argumente geliefert, auch wenn Sie für sie definiert keine Parameter haben (here's an example)

Etwas, das möglich wäre, eine Folge von 10 zu erhalten, die von Interesse sein könnten den folgenden Code verwenden:

var result = multiplier(2)(5); // result = 10 
+1

Ok. Jetzt sehe ich es. Und ich verstehe auch, warum Multiplikator (2,5) nicht 10 zurückgeben kann. Danke Kumpel! –

+0

'Faktor' wird nicht an die anonyme Funktion übergeben. Es ist innerhalb der Funktion zugänglich, weil es eine freie Variable ist und die anonyme Funktion eine Schließung ist. Diese Unterscheidung ist wichtig, weil freie Variablen auf dem Heap und nicht auf dem Stapel gespeichert werden. – ftor

+0

@ LUH3417: Ich sage, dass die Faktorvariable übergeben wird, wenn die Funktion 'multiplier' aufgerufen wird. Ich behaupte nicht, dass es an die anonyme Funktion weitergegeben wird. Alles was ich sage ist, dass es von der zurückgegebenen Funktion (anonym) * benutzt wird. Ich denke, Ihr Kommentar wird für jeden ausreichen, der meine Aussage so interpretiert, wie Sie sie haben – musefan

1

Wenn Sie

console.log(multiplier(2,5)) 

ausführen rufen Sie die Funktion geben zwei para Meter, während

function multiplier(factor) {} 

nur einen Parameter dauert.

2

Multiplikator ist eine Funktion, die anonyme Funktion gibt, die ist

var twice = multiplier(2); 

Im Grunde ein Argument (Zahl)

akzeptiert: -

var twice = function(number) { 
     return number * 2; 
    };