JavaScript-Abschlüsse sind für einige Entwickler zu einem Gegenstand der Verwirrung geworden. Während alle JavaScript-Funktionen Abschlüsse sind, ist eine bestimmte Teilmenge von besonderem theoretischen Interesse. Ziel dieses Artikels ist es, das Konzept zu klären und zu bestimmen, welcher der beiden Codeblöcke genau Schließungen verwendet.
Abschlüsse verstehen:
Ein Abschluss ist eine Funktion, die den Zugriff auf erfasst und aufrechterhält Variablen aus dem umschließenden Bereich, auch wenn dieser Bereich nicht mehr aktiv ist. Im Wesentlichen ist ein Abschluss eine Funktion, die über einen Speicher verfügt und auf Daten aus ihrem übergeordneten Bereich zugreifen kann, die als „Variablen des übergeordneten Bereichs“ oder „Upvalues“ bezeichnet werden.
Abschlüsse identifizieren:
Um festzustellen, ob eine Funktion ein Abschluss ist, müssen wir ihre Variablen untersuchen. Funktionen, die keine nicht-lokalen Variablen (d. h. frei variable Variablen) haben, können keine Abschlüsse sein. Funktionen mit nicht-lokalen Variablen müssen von außerhalb ihres übergeordneten Bereichs referenziert werden, um Abschlüsse zu werden.
Fall 1: Friend's Program
<code class="javascript">for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); }</code>
In diesem Fall die Funktion Es fehlen geschlossene Variablen für den übergeordneten Bereich und es handelt sich daher nicht um einen Abschluss. Die an setTimeout übergebene innere Funktion ist jedoch ein Abschluss, da sie den Zugriff auf die freie Variable i2 erfasst und aufrechterhält.
Fall 2: Autorenprogramm
<code class="javascript">for(var i = 0; i < 10; i++) { setTimeout((function(i2){ return function() { console.log(i2); } })(i), 1000); }</code>
Hier , die innere Funktion behält den Zugriff auf die freie Variable i2 bei und bleibt ein Abschluss, auch wenn außerhalb ihres übergeordneten Bereichs referenziert wird.
Schlussfolgerung:
In beiden Fällen werden Abschlüsse verwendet . Das Programm des Autors verwendet einen Abschluss, um den Wert von i richtig zu erfassen. Durch die Rückgabe einer anderen Funktion und deren Übergabe an setTimeout kann die innere Funktion auf die geschlossene Variable i2 zugreifen. Dadurch wird sichergestellt, dass nach der Verzögerung der korrekte Wert auf der Konsole ausgegeben wird.
Das obige ist der detaillierte Inhalt vonSind anonyme Funktionen in JavaScript immer Abschlüsse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!