2016-10-17 7 views
0

Auf www.w3schools.com/js/js_function_closures.asp gibt es ein einfaches Beispiel eines Zählers in einem Verschluss, und soweit ich das beurteilen kann, ein IIFE:JavaScript Zähler mit Verschluss und IIFE

var add = (function() { 
    var counter = 0; 
    console.log(counter); 
    return function() {return counter += 1;} 
})(); 

add(); 
add(); 
add(); 

// the counter is now 3 

Aber nach stundenlangem Lesen von Scope, Closures und IIFEs, nicht zum ersten Mal, und mit Blick auf andere einfache Beispiele, verstehe ich immer noch nicht, warum die Zeile var counter = 0; nur einmal ausgeführt wird. Das Konsolenprotokoll, das ich direkt nach dieser Zeile hinzugefügt habe, gibt nie etwas aus, als ob es nie aufgerufen würde.

Warum wird der Zähler bei jedem Aufruf von add() nicht auf 0 zurückgesetzt? Welche Konzepte verstehe ich falsch? Danke für Ihre Hilfe.

+0

Die Funktion wird sofort aufgerufen, so dass die 'counter' Initialisierung nur einmal erfolgt. Nun ist 'add' die zurückgegebene Funktion, die nur' counter' erhöht. – Li357

+1

'var add' verweist nicht auf die äußere Funktion, die nach dem' = 'steht; es bezieht sich auf den, der von 'return function() {...}' zurückgegeben wird, also ist es derjenige, den Sie aufrufen, wenn Sie 'add()' eingeben. –

+0

Die 'console.log' Zeile * gibt * für mich vor dem ersten' add() 'Aufruf '0' aus? – Bergi

Antwort

0

Der erste Schritt für den Motor Javascript (nach add erklärt) ist add zu initialisieren, die in einem Aufruf des IIFE führt, die wiederum zur Folge hat:

var add = function() { 

    return counter = counter++ 
} 

weil die IIFE gibt diese Funktion den Wert zu zugewiesen sein zu add. Die Funktion, die add zugewiesen ist, hat weiterhin Zugriff auf den lexikalischen Geltungsbereich des IIFE (var counter): das ist Closure.

Jeder add() ist ein Aufruf der vom IIFE zurückgegebenen Funktion und daher wird var counter = 0 nur einmal aufgerufen (zum Zeitpunkt der Initialisierung add).

1

Ich verstehe immer noch nicht, warum der var-Zähler = 0; Zeile ist nur einmal ausgeführt.

Da die IIFE-Funktion nur einmal aufgerufen wird. Die add() Anrufe führen Sie diese Funktion:

function() {return counter += 1;} 

, die aus der IIFE zurückgeführt wird. Sie können das überprüfen, indem Funktionen Namen geben und Inspektion der Name der Funktion ausgeführt wird:

var add = (function iife() { 
    var counter = 0; 
    console.log(counter); 
    return function inner() {return counter += 1;} 
})(); 

add.name; // `inner`, not `iife` 

Das Konsolenprotokoll ich Recht gegeben, nachdem diese Linie nie etwas ausgibt, , als ob es nie

aufgerufen wird

Es kann nicht sein. Es sollte 0 nur einmal ausgeben.