Heim >Web-Frontend >js-Tutorial >Warum gibt „setTimeout' in einer „for'-Schleife unerwartete Werte aus und wie kann dies behoben werden?

Warum gibt „setTimeout' in einer „for'-Schleife unerwartete Werte aus und wie kann dies behoben werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-15 21:13:11614Durchsuche

Why Does `setTimeout` in a `for` Loop Print Unexpected Values, and How Can This Be Fixed?

Konsekutiver Wertdruck in For-Schleifen mit setTimeout

Problem:

Im Folgenden Im Skript wird die Funktion „setTimeout“ innerhalb einer for-Schleife verwendet, um Werte nacheinander zu alarmieren. Die resultierende Ausgabe zeigt jedoch, dass der Wert „3“ zweimal anstelle von „1“ und „2“ gedruckt wird, wie erwartet.

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

Grund:

Das Problem entsteht, weil der Wert von i in der for-Schleife im Laufe der Zeit geändert wird, die Funktion setTimeout jedoch nur einen Verweis auf das Original erfasst Variable.

Lösung:

Um dieses Problem zu beheben, sollte die i-Variable als eindeutiger Wert für jede Timeout-Funktion erfasst werden. Dies kann erreicht werden, indem eine neue Funktion erstellt wird, die i als Argument verwendet und dann setTimeout mit diesem Argument aufruft:

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

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

Bei diesem Ansatz erstellt jede Iteration der Schleife eine eindeutige Kopie der i-Variablen. Stellen Sie sicher, dass die gemeldeten Werte wie erwartet nacheinander gedruckt werden.

Das obige ist der detaillierte Inhalt vonWarum gibt „setTimeout' in einer „for'-Schleife unerwartete Werte aus und wie kann dies behoben werden?. 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