Heim >Web-Frontend >js-Tutorial >Verwendet der JavaScript-Code Ihres Freundes tatsächlich Schließungen?

Verwendet der JavaScript-Code Ihres Freundes tatsächlich Schließungen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 06:11:02528Durchsuche

Is Your Friend's JavaScript Code Actually Using Closures?

JavaScript-Abschlüsse vs. anonyme Funktionen

Frage:

In einer Diskussion über Abschlüsse in JavaScript behauptete ein Freund das Ihrer Umsetzung mangelte es an Abschlüssen, während die anderen das Gegenteil argumentierten. Können Sie bestimmen, welche Lösung Abschlüsse verwendet, indem Sie das Konzept der Abschlüsse anwenden?

Lösung:

Abschlussdefinition: Ein Abschluss in JavaScript bezieht sich auf a Teilmenge von Funktionen mit freien Variablen (Variablen, die in einem übergeordneten Bereich definiert sind), auf die von einem anderen Bereich aus verwiesen wird. Wenn auf einen Abschluss außerhalb seines übergeordneten Bereichs verwiesen wird, wird er über dem Upvalue (der freien Variablen) aus diesem Bereich geschlossen.

Fall 1: Das Programm Ihres Freundes

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

Analyse:

  • Die Funktion f ist kein Abschluss, da alle freien Variablen (i, setTimeout und console) an den globalen Gültigkeitsbereich gebunden sind und keine von ihnen geschlossen ist über.
  • Die Funktion g ist jedoch ein Abschluss, da sie über der Variablen i2 abschließt, die an den Gültigkeitsbereich von f gebunden ist. Wenn g innerhalb von setTimeout referenziert wird, behält es den Zugriff auf i2.

Fall 2: Ihr Programm

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

Analyse:

  • Die Funktion f ist kein Abschluss, da sie keine freien Variablen hat.
  • Die Funktion g ist jedoch ein Abschluss, da sie über der Variablen i2 abschließt, die gebunden ist im Umfang von f. Wenn g innerhalb von setTimeout referenziert wird, behält es den Zugriff auf i2.

Schlussfolgerung:

Sowohl Sie als auch Ihr Freund verwenden in Ihren Implementierungen Abschlüsse. Der Unterschied besteht darin, dass im Programm Ihres Freundes der Abschluss innerhalb der inneren Funktion g erstellt wird, während in Ihrem Programm der Abschluss innerhalb der äußeren Funktion f erstellt wird.

Das obige ist der detaillierte Inhalt vonVerwendet der JavaScript-Code Ihres Freundes tatsächlich Schließungen?. 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