Heim >Web-Frontend >js-Tutorial >Warum gibt eine For-Schleife mit setTimeout unerwartete Werte aus?

Warum gibt eine For-Schleife mit setTimeout unerwartete Werte aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-29 07:46:15944Durchsuche

Why Does a For-Loop with setTimeout Print Unexpected Values?

In setTimeout eingeschlossene For-Schleife gibt unerwartete Werte aus

In diesem Skript iteriert eine For-Schleife mit der Variablen i von 1 bis 2, und innerhalb der Schleife wird eine Timeout-Funktion mit einer Verzögerung von 100 Millisekunden eingestellt, um den Wert von i bei der Ausführung zu benachrichtigen. Das erwartete Verhalten besteht jedoch darin, dass das Skript 1 und 2 nacheinander ausgibt, stattdessen jedoch 3 zweimal alarmiert wird.

Das unerwartete Verhalten ergibt sich aus der Tatsache, dass i in der gesamten Schleife gemeinsam genutzt wird und als Schleife geändert wird schreitet voran. Zum Zeitpunkt der Ausführung der Timeout-Funktionen hat i bereits 3 erreicht, was dazu führt, dass beide Warnungen diesen Wert anzeigen.

Um dieses Problem zu beheben und aufeinanderfolgende gedruckte Werte sicherzustellen, ist es notwendig, für jede Timeout-Funktion separate Kopien von i zu erstellen . Dies kann durch die Definition einer dedizierten Funktion, doSetTimeout, erreicht werden, die i als Argument verwendet und das Timeout mithilfe dieses spezifischen Werts festlegt.

Das geänderte Skript, das doSetTimeout verwendet, lautet wie folgt:

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

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

Mit dieser Änderung erstellt jede Iteration der Schleife eine neue Kopie von i, die an doSetTimeout übergeben wird, um sicherzustellen, dass jedes Timeout mit dem richtigen Wert ausgeführt wird.

Das obige ist der detaillierte Inhalt vonWarum gibt eine For-Schleife mit setTimeout unerwartete 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