Heim  >  Artikel  >  Web-Frontend  >  Wann wird eine anonyme Funktion in JavaScript zu einem Abschluss?

Wann wird eine anonyme Funktion in JavaScript zu einem Abschluss?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 08:05:02971Durchsuche

When Does an Anonymous Function Become a Closure in JavaScript?

JavaScript-Abschlüsse im Vergleich zu anonymen Funktionen

Anonyme Funktionen, ein häufiges Merkmal in JavaScript, tauchen häufig in Diskussionen über Abschlüsse auf. Allerdings qualifizieren sich nicht alle anonymen Funktionen als echte Abschlüsse.

Abschlüsse definieren

Ein Abschluss in JavaScript ist eine spezielle Art anonymer Funktion, die den Zugriff auf den lexikalischen Bereich in behält in dem es erstellt wurde, auch nachdem der äußere Geltungsbereich beendet ist. Mit dieser Funktion können Abschlüsse die Werte von Variablen aus dem äußeren Bereich „erfassen“ und so verhindern, dass sie durch Garbage Collection erfasst werden.

Fallstudie: Abschluss über eine Variable

In In den angegebenen Codebeispielen verwenden beide Lösungen anonyme Funktionen, um das Drucken der Zählervariablen i zu verzögern.

Versuch eines Freundes

Der Code im ersten Beispiel scheint das zu erfassen i-Variable innerhalb des Abschlusses. Es erfüllt jedoch nicht die Definition eines Abschlusses, da die innere anonyme Funktion g nicht den lexikalischen Bereich der äußeren Funktion f erbt. Somit ist i nicht wirklich „geschlossen“.

<code class="javascript">for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}</code>

Versuch des Herausgebers

Das zweite Codebeispiel erstellt tatsächlich einen Abschluss. Die von der äußeren Funktion f zurückgegebene anonyme Funktion erfasst die i2-Variable und behält ihren Wert innerhalb des lexikalischen Bereichs des Abschlusses bei. Dieser Abschluss wird dann innerhalb des setTimeout-Rückrufs aufgerufen, um sicherzustellen, dass auf den ursprünglichen Wert der i-Variablen zugegriffen wird.

<code class="javascript">for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2);
        }
    })(i), 1000);
}</code>

Fazit

Im bereitgestellten Code die Lösung des Herausgebers demonstriert die korrekte Verwendung eines Abschlusses zum Erfassen des Werts der i-Variablen. Während beide Lösungen das Problem des verzögerten Druckens effektiv lösen, gilt nur die Lösung des Herausgebers als Abschluss im technischen Sinne.

Das obige ist der detaillierte Inhalt vonWann wird eine anonyme Funktion in JavaScript zu einem Abschluss?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn