Ich habe ein Problem mit einer For-Schleife, die eine setTimeout ausgeführt.Javascript for-Schleife und Timeout-Funktion
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
I erwarten, dass das Ausgangs
Doch aus irgendeinem Grund sie alle Ausgaben 5.
Variable x
wird im lokalen Bereich der for-Schleife definiert, so dass ich dachte, das nicht für den Rückruf von setTimeout zählen kann. Ich habe mit der Definition x
außerhalb der for-Schleife getestet.
var x = 10
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
dachte ich, dieser Ausgang 10 werden geben würde, aber es kam nicht. Dann dachte ich, es wäre sinnvoll, danach x zu definieren.
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
var x = 10
Diese Rückkehr ist nur 10. Das bedeutet, die Rückrufe sind alle aufgerufen, nachdem die for-Schleife ausgeführt wird? Und warum passen sie nur dann zum übergeordneten Bereich der for-Schleife, wenn die Variable nach der Ausführung der for-Schleife initialisiert wurde? Fehle ich etwas?
Ich weiß, wie dieses Beispiel mit
for (var x = 0; x < 5; x++) {
var timeoutFunction = function(x) {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(x), 1)
}
Dennoch arbeiten machen, frage ich mich wirklich, was fehlt ...
Danke für die tollen Beispiele und Links! Zuerst konnte ich die Bemerkung zu den Schließungen nicht vollständig verstehen. Die Referenz machte es klarer und dann verstand ich genau, was du meintest :) "Der Grund dafür ist, dass die zugewiesene Funktion eine Schließung ist; sie besteht aus der Funktionsdefinition und der erfassten Umgebung aus dem Funktionsumfang. Fünf Schließungen wurden gemacht erstellt von der Schleife, aber jeder teilt die gleiche einzelne Umgebung, die eine Variable mit sich ändernden Wert "x" hat. Wenn die setTimeout-Callbacks ausgeführt werden, bewirkt das Zugreifen auf "x" in diesem Moment " – jervtub
@jervtubu Gern geschehen. Verschlüsse sind in der Regel eines der schwierigeren Dinge, um Ihre Meinung zu bekommen und sie brauchen ein wenig Übung zu verstehen. Vergessen Sie nicht, als Antwort zu markieren. Viel Glück! –