Wie erfassen Verschlüsse Werte aus früheren Aufrufen?

9
%Vor%

Wird 'Line A' nicht jedes Mal aufgerufen, wenn wir counter1() aufrufen? Das bedeutet, dass var n = 0 jedes Mal aufgerufen werden sollte ...

Warum gibt der Zähler unterschiedliche Werte zurück? Sollten sie nicht immer '1' zurückgeben?

    
Honey 15.06.2016, 14:59
quelle

2 Antworten

1

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:

%Vor%

Jetzt haben sowohl counter1 als auch counter2 jeweils eigene Instanzen von n .

    
Alexander 15.06.2016, 15:07
quelle
1

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.

Scott Hunter 15.06.2016 15:07
quelle

Tags und Links