Heim >Web-Frontend >js-Tutorial >Warum gibt verschachteltes „setTimeout' in einer JavaScript-„for'-Schleife nicht aufeinanderfolgende Werte aus?

Warum gibt verschachteltes „setTimeout' in einer JavaScript-„for'-Schleife nicht aufeinanderfolgende Werte aus?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-15 15:32:14856Durchsuche

Why Does Nested `setTimeout` in a JavaScript `for` Loop Print Non-Consecutive Values?

Das Problem verstehen: Nicht aufeinanderfolgende Wertedruck in setTimeout verschachtelt in for-Loop

In JavaScript planen asynchrone Funktionen wie setTimeout einen Rückruf nach einer Verzögerung ausführen. Wenn dies innerhalb einer Schleife platziert wird, kann dies zu unerwartetem Verhalten führen, bei dem die Variablen, auf die der Rückruf zugreift, möglicherweise nicht mit dem Status der Schleife synchronisiert sind.

Das Beispiel: Warnung vor falschen Werten

Beachten Sie das bereitgestellte Skript:

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

Dieser Code soll die Werte 1 und 2 nacheinander alarmieren, aber stattdessen gibt 3 zweimal aus. Der Grund liegt in der asynchronen Natur von setTimeout, das einen Rückruf erstellt, der auf den aktuellen Wert von i verweist.

Übergabe von i ohne Funktionszeichenfolge

Um dieses Problem zu beheben Um die fortlaufende Ausgabe von Werten sicherzustellen, müssen wir für jeden setTimeout-Rückruf eine eigene Instanz von i erstellen. Hier ist eine Lösung:

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

Indem wir für jeden Rückruf eine explizite Funktion erstellen und i als Argument übergeben, erstellen wir für jede Iteration der Schleife separate Kopien von i. Dadurch können die Rückrufe bei der Ausführung auf den korrekten Wert von i verweisen und so die aufeinanderfolgende Ausgabe von 1 und 2 sicherstellen.

Das obige ist der detaillierte Inhalt vonWarum gibt verschachteltes „setTimeout' in einer JavaScript-„for'-Schleife nicht aufeinanderfolgende Werte aus?. 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