Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die for Anweisung erstellt eine Schleife, die aus drei optionalen Ausdrücken besteht, eingeschlossen in Klammern und durch Semikolons getrennt, gefolgt von einer Anweisung (in der Regel ein Block Anweisung), die in der Schleife ausgeführt wird.
Ein Ausdruck (einschließlich Zuweisungsausdrücke) oder eine Variablendeklaration, die einmalig vor Beginn der Schleife ausgewertet wird. Wird typischerweise verwendet, um eine Zählvariable zu initialisieren. Dieser Ausdruck kann optional neue Variablen mit den Schlüsselwörtern var oder let deklarieren. Variablen, die mit var deklariert werden, sind nicht lokal zur Schleife, d.h. sie befinden sich im gleichen Gültigkeitsbereich, in dem die for Schleife steht. Variablen, die mit let deklariert werden, sind lokal zur Anweisung.
Das Ergebnis dieses Ausdrucks wird verworfen.
condition OptionalEin Ausdruck, der vor jeder Iteration der Schleife ausgewertet wird. Wenn dieser Ausdruck wahrheitsgemäß ausgewertet wird, wird statement ausgeführt. Wenn der Ausdruck falsche Werte auswertet, wird die Ausführung der Schleife beendet und zur ersten Anweisung nach dem for Konstrukt gesprungen.
Dieser Bedingungstest ist optional. Wenn er weggelassen wird, wird die Bedingung immer als wahr bewertet.
afterthought OptionalEin Ausdruck, der am Ende jeder Schleifeniteration ausgewertet wird. Dies geschieht vor der nächsten Auswertung von condition. Wird im Allgemeinen verwendet, um die Zählvariable zu aktualisieren oder zu inkrementieren.
statementEine Anweisung, die so lange ausgeführt wird, wie die Bedingung als wahr bewertet wird. Sie können eine Block Anweisung verwenden, um mehrere Anweisungen auszuführen. Um keine Anweisung innerhalb der Schleife auszuführen, verwenden Sie eine leere Anweisung (;).
Wie andere Schleifenanweisungen können Sie Steuerflussanweisungen innerhalb von statement verwenden:
Die folgende for Anweisung beginnt mit der Deklaration der Variablen i und initialisiert sie mit 0. Sie überprüft, dass i kleiner als neun ist, führt die beiden nachfolgenden Anweisungen aus und inkrementiert i um 1 nach jedem Durchlauf der Schleife.
Der Initialisierungsblock akzeptiert sowohl Ausdrücke als auch Variablendeklarationen. Ausdrücke können jedoch den in Operator nicht unparenthesized verwenden, da dies mit einer for...in Schleife mehrdeutig ist.
Alle drei Ausdrücke im Kopf der for Schleife sind optional. Zum Beispiel ist es nicht erforderlich, den initialization Block zu verwenden, um Variablen zu initialisieren:
Wie der initialization Block ist auch der condition Teil optional. Wenn Sie diesen Ausdruck weglassen, müssen Sie sicherstellen, dass die Schleife im Körper beendet wird, um keine Endlosschleife zu erzeugen.
Sie können auch alle drei Ausdrücke weglassen. Stellen Sie wiederum sicher, dass Sie eine break Anweisung verwenden, um die Schleife zu beenden und auch eine Variable zu modifizieren (zu erhöhen), sodass die Bedingung für die break Anweisung zu einem bestimmten Zeitpunkt wahr ist.
In dem Fall, dass Sie nicht alle drei Ausdruckspositionen vollständig nutzen – insbesondere wenn Sie keine Variablen mit dem ersten Ausdruck deklarieren, sondern etwas im oberen Gültigkeitsbereich ändern – überlegen Sie, stattdessen eine while Schleife zu verwenden, was die Absicht klarer macht.
Eine Variable innerhalb des Initialisierungsblocks zu deklarieren hat wichtige Unterschiede im Vergleich zur Deklaration im oberen Gültigkeitsbereich, insbesondere bei der Erstellung einer closure innerhalb des Schleifenrumpfes. Zum Beispiel, für den folgenden Code:
Es protokolliert 0, 1 und 2, wie erwartet. Wird die Variable jedoch im oberen Gültigkeitsbereich definiert:
Es protokolliert 3, 3 und 3. Der Grund dafür ist, dass jede setTimeout ein neues closure erstellt, das die i Variable umschließt, aber wenn die i nicht auf den Schleifenrumpf beschränkt ist, werden alle closures auf die gleiche Variable verweisen, wenn sie schließlich aufgerufen werden – und aufgrund der asynchronen Natur von setTimeout() wird dies passieren, nachdem die Schleife bereits beendet wurde, wodurch der Wert von i in allen anstehenden Rückrufen den Wert 3 hat.
Dies passiert auch, wenn Sie eine var Anweisung als Initialisierung verwenden, da Variablen, die mit var deklariert sind, nur auf Funktionsebene gescoped, aber nicht lexikalisch gescoped sind (d.h. sie können nicht auf den Schleifenrumpf gescoped werden).
Die Scopingwirkung des Initialisierungsblocks kann verstanden werden, als ob die Deklaration innerhalb des Schleifenrumpfes passiert, aber zufällig innerhalb der condition und afterthought Teile zugänglich ist. Genauer gesagt, let Deklarationen sind in for Schleifen speziell behandelt — wenn initialization eine let Deklaration ist, dann passiert jedes Mal nach Auswertung des Schleifenrumpfes folgendes:
Das Neuzuweisen der neuen Variablen innerhalb von afterthought betrifft nicht die Bindungen aus der vorherigen Iteration.
Ein neuer lexikalischer Gültigkeitsbereich wird auch nach initialization erstellt, bevor condition zum ersten Mal ausgewertet wird. Diese Details können durch die Erstellung von closures beobachtet werden, die es ermöglichen, eine Bindung zu einem bestimmten Punkt zu erhalten. Zum Beispiel in diesem Code, wird eine closure, die innerhalb des initialization Abschnitts erstellt wurde, nicht durch Neuzuweisungen von i in afterthought aktualisiert:
Das protokolliert nicht "0, 1, 2", wie es der Fall wäre, wenn getI im Schleifenrumpf deklariert wäre. Das liegt daran, dass getI nicht bei jeder Iteration neu ausgewertet wird — vielmehr wird die Funktion einmal erstellt und umschließt die i Variable, die sich auf die Variable bezieht, die bei der ersten Initialisierung der Schleife deklariert wurde. Nachfolgende Aktualisierungen des Wertes von i erstellen tatsächlich neue Variablen namens i, die getI nicht sieht. Eine Möglichkeit, dies zu beheben, besteht darin, getI jedes Mal neu zu berechnen, wenn i aktualisiert wird:
Die i Variable innerhalb des initialization ist von der i Variable innerhalb jeder Iteration, einschließlich der ersten, verschieden. In diesem Beispiel gibt getI 0 zurück, obwohl der Wert von i innerhalb der Iteration vorher inkrementiert wurde:
Tatsächlich können Sie diese anfängliche Bindung der i Variable einfangen und später neu zuweisen, und dieser aktualisierte Wert wird im Schleifenrumpf nicht sichtbar sein, der die nächste neue Bindung von i sieht.
Dies protokolliert "0, 0, 0", weil die i Variable in jeder Schleifenauswertung tatsächlich eine separate Variable ist, aber getI und incrementI lesen und schreiben beide die anfängliche Bindung von i, nicht das, was anschließend deklariert wurde.
Der folgende for Zyklus berechnet die Versatzposition eines Knotens im afterthought Abschnitt und benötigt daher nicht die Verwendung eines statement Abschnitts, ein Semikolon wird stattdessen benutzt.
Beachten Sie, dass das Semikolon nach der for Anweisung obligatorisch ist, da es als eine leere Anweisung steht. Andernfalls würde die for Anweisung die folgende console.log Zeile als ihren statement Abschnitt übernehmen, wodurch der log mehrmals ausgeführt wird.
Sie können zwei Zähler erstellen, die in einer for Schleife gleichzeitig mit dem Komma-Operator aktualisiert werden. Mehrere let und var Deklarationen können auch mit Kommas verbunden werden.
| ECMAScript® 2027 Language Specification # sec-for-statement |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.