Sie haben makeCounter()
einmal aufgerufen. Das erstellt Ihre neue Schließung und weist sie counter1
zu. Diese Schließung schließt sich über die veränderbare var n
und bleibt so lange gefangen, wie diese Schließung existiert.
Der Aufruf von counter1()
führt ihn aus, behält jedoch die gleiche erfasste n
und mutiert sie. Dieser spezielle "Addierer" wird IMMER denselben n
erfassen, solange er existiert ..
Um das von Ihnen vorgeschlagene Verhalten zu erhalten, müssen Sie neue Schließungen vornehmen, die neue Instanzen von n
erfassen:
Jetzt haben sowohl counter1
als auch counter2
jeweils eigene Instanzen von n
.
Offensichtlich wird Zeile A nicht aufgerufen, wenn counter1
aufgerufen wird.
Die Reihenfolge der Ereignisse ist:
makeCounter
wird aufgerufen, die n
(Zeile A) deklariert und initialisiert, adder
definiert und adder
in einem Kontext zurückgibt, in dem n
bereits definiert ist und initialisiert auf 1 .
Es wurde gerade diese Funktion zurückgegeben, die counter1
zugewiesen wurde. Da die Linie A nicht Teil dieser Funktion ist ( adder
/ counter1
), wird sie beim Aufruf dieser Funktion nicht ausgeführt.
Jeder Aufruf von counter1
wird in demselben Kontext ausgeführt, weshalb n
seinen Wert über Aufrufe hinweg behält: Sie greifen alle auf dasselbe n
zu.