JavaScript-Schließungen im Vergleich zu anonymen Funktionen

Einem Freund von mir und ich sind derzeit in der Diskussion, was eine Schließung in JS ist, und was nicht. Wir wollen einfach nur sicherstellen, dass wir wirklich es richtig zu verstehen.

Nehmen wir mal dieses Beispiel. Wir haben eine zählschleife und drucken möchten, die Zähler-variable auf der Konsole verzögert. Deshalb verwenden wir setTimeout und Verschlüsse zu erfassen den Wert der counter-variable, um sicherzustellen, dass es nicht zu drucken, die N-fache Wert N.

Die falsche Lösung, ohne Verschlüsse oder irgendetwas in der Nähe Verschlüsse wäre:

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}

welche natürlich drucken 10-fachen Wert der i nach der Schleife, nämlich 10.

So sein Versuch war:

for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}

Druck 0 bis 9, wie erwartet.

Ich sagte ihm, dass er nicht mit einem Schließung zu erfassen iaber er besteht darauf, dass er es ist. Ich habe gezeigt, dass er nicht die Verschlüsseindem Sie die for-Schleife innerhalb einer anderen setTimeout (vorbei seinem anonymen Funktion setTimeout), Druck 10 mal 10 wieder. Das gleiche gilt, wenn ich seine speichern-Funktion in einem var und führen Sie es nach die Schleife, auch Druck 10 mal 10. Also mein argument ist, dass er nicht wirklich erfassen der Wert iseine version nicht eine Schließung.

Mein Versuch war:

for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2);
        }
    })(i), 1000);
}

Also ich capture i (benannt i2 innerhalb der closure), aber jetzt habe ich zurück eine andere Funktion auf und übergeben Sie diese um. In meinem Fall, die Funktion übergeben setTimeout wirklich erfasst i.

Jetzt, Verschlüsse und wer nicht?

Beachten Sie, dass beide Lösungen drucken 0 bis 9 auf der Konsole verzögert, so dass Sie lösen das ursprüngliche problem, aber wir wollen verstehen, welche dieser beiden Lösungen verwendet Verschlüsse um dies zu erreichen.

InformationsquelleAutor der Frage leemes | 2012-10-17

Schreibe einen Kommentar