Schleifen (while/for/do-while) |
|
Schleifen mit "while" |
|
Anzeigebeispiel: So sieht's aus
Mit Hilfe von while-Schleifen können Sie Programmanweisungen solange wiederholen, wie die Bedingung, die in der Schleife formuliert wird, erfüllt ist.
<html> <head> <title>User checken</title> <script language="JavaScript"> <!-- var Passwort = "Traumtaenzer"; var UserEingabe = ""; var Zaehler = 0; while((UserEingabe != Passwort)&&(Zaehler <= 3)) { UserEingabe = window.prompt(Zaehler + ". Versuch: geben Sie das Passwort ein",""); Zaehler++; } if(UserEingabe != Passwort) history.back(); else document.location.href="geheim.htm"; // --> </script> </head> <body> </body> </html> |
Eine while-Schleife beginnt mit dem Wort while (while = solange). Dahinter folgt, in Klammern stehend, die Bedingung. Um eine Bedingung zu formulieren, brauchen Sie Vergleichsoperatoren. Der Inhalt der Schleife wird solange wiederholt, wie die Schleifenbedingung wahr ist.
In der Regel enthält eine while-Schleife mehrere Anweisungen, die innerhalb der Schleife stehen. Notieren Sie alle Anweisungen innerhalb geschweifter Klammern { und }, so wie im Beispiel (siehe auch den Abschnitt über Anweisungsblöcke).
Das obige Beispiel stellt eine einfache Passwortabfrage dar. Der Anwender hat drei Versuche, das Passwort richtig einzugeben. Dazu wird eine Schleife eingesetzt.
Achten Sie bei solchen Schleifen immer darauf, daß es mindestens eine Möglichkeit gibt, um die Schleife nach einer angemessenen Zeit zu beenden. Andernfalls erzeugen Sie eine sogenannte "Endlosschleife", aus der der Anwender nur durch gewaltsames Beenden des WWW-Browsers herauskommt. Das ist besonders bei Online-Sitzungen im WWW sehr ärgerlich!
Um Endlosschleifen zu vermeiden, brauchen Sie irgendetwas, das irgendwann zu einem Ausweg aus der Schleife führt. Meistens werden zu diesem Zweck sogenannte "Zähler" definiert, im Beispiel die Variable Zaehler. Diese Variable hat im Beispiel einen Anfangswert von 0 und wird innerhalb der Schleife bei jedem Durchgang mit der Anweisung Zaehler++; um 1 erhöht. Wenn im Beispiel der Zählerstand größer gleich 3 ist, wird abgebrochen.
Weitere Möglichkeiten, um Schleife abzubrechen, werden weiter unten beschrieben.
Mit Hilfe von for-Schleifen vermeiden Sie die Probleme von while-Schleifen. Die Schleifenbedingung einer for-Schleife sieht von vorneherein einen Zähler und eine Abbruchbedingung vor.
<html><head><title>Test</title> </head><body> <script language="JavaScript"> <!-- for(i = 1; i <= 100; i++) { var x = i * i; document.write("<br>Das Quadrat von " + i + " ist " + x); // --> </script> </body></html> |
Eine for-Schleife beginnt mit dem Wort for. Dahinter wird, in Klammern stehend, die Schleifenbedingung formuliert. Bei der for-Schleife gilt dabei eine feste Syntax. Innerhalb der Schleifenbedingung werden drei Anweisungen notiert. In der ersten Anweisung wird ein Schleifenzähler definiert und initialisiert. Im Beispiel wird ein Zähler i definiert und mit dem Wert 1 initialisiert. Die zweite Anweisung enthält die Bedingung, ab der die Schleife beendet wird. Dazu brauchen Sie Vergleichsoperatoren. In der dritten Anweisung wird der Schleifenzähler so verändert, daß er irgendwann die in der zweiten Anweisung notierte Bedingung erfüllt. Im Beispiel wird i bei jedem Schleifendurchgang um 1 erhöht, so daß der Wert irgendwann größer 100 ist und damit die Bedingung der zweiten Anweisung erfüllt.
Das Beispiel benutzt den Schleifenzähler, um bei jedem Schleifendurchgang das Quadrat des aktuellen Werts zu ermitteln. Das Ergebnis wird dann HTML-formatiert ins aktuelle Dokumentfenster geschrieben.
Eine spezielle Abart der for-Schleife ist die for-in-Schleife.
<script language="JavaScript"> <!-- function Objekteigenschaften(Objekt, ObjName) { var Ergebnis = ""; for (var Eigenschaft in Objekt) { Ergebnis += ObjName + "." + Eigenschaft + " = " + Objekt[Eigenschaft] + "<br>"; } return Ergebnis; } // --> </script> |
In diesem Beispiel ermittelt die Funktion Objekteigenschaften alle Eigenschaften eines JavaScript-Objekts. Die ermittelten Eigenschaften sammelt die Funktion in einer HTML-formatierten Zeichenkette und gibt diese an eine aufrufende Funktion zurück.
Die do-while-Schleife ist eine Variante der normalen while-Schleife. Der Unterschied zwischen beiden ist, daß bei der normalen while-Schleife vor dem Ausführen des Codes die Schleifenbedingung überprüft wird, während bei der do-while-Schleife zuerst der Code ausgeführt und erst danach die Schleifenbedingung überprüft wird. Auf diese Weise können Sie erzwingen, daß Anweisungen innerhalb der Schleife auf jeden Fall mindestens einmal ausgeführt werden, auch wenn sich die Schleifenbedingung gleich am Anfang als unwahr herausstellt.
Einmal so: <script language="JavaScript"> <!-- var x = 10; do { document.write("<br>x * x = " + (x * x)); x = x + 1; } while(x < 10); // --> </script> <p> Und einmal so: <script language="JavaScript"> <!-- var x = 10; while(x < 10) { document.write("<br>x * x = " + (x * x)); x = x + 1; } // --> </script> |
Im Beispiel werden zwei kleine JavaScript-Bereiche definiert. In beiden Bereichen wird eine Variable x definiert und mit dem Wert 10 vorbelegt. Im ersten Bereich wird solange das Quadrat von x (das bei jedem Schleifendurchlauf um 1 erhöht wird) geschrieben, wie x kleiner als 10 ist. Da x ja schon am Beginn den Wert 10 hat, ist die Abbruchbedingung eigentlich schon von vorneherein erfüllt. Trotzdem wird ein mal das Quadrat von x ausgegeben, da die Überprüfung der Schleifenbedingung erst nach dem Ausführen der Anweisungen innerhalb der Schleife erfolgt.
Im zweiten Script-Bereich herrschen die gleichen Bedingungen, jedoch wird dort eine normale while-Schleife notiert. Da x von vorneherein nicht kleiner als 10 ist, werden die Anweisungen der while-Schleife kein einziges mal ausgeführt. Die Überprüfung der Schleifenbedingung, die am Anfang stattfindet, verhindert dies.
Schleifen sind "kritische Faktoren" innerhalb eines Scripts. Bei komplizierteren Aufgaben ist es manchmal nicht einfach, eine Schleife so zu programmieren, daß die Schleife in jedem Fall irgendwann mal abgebrochen wird. Deshalb gibt es zusätzliche Befehle, um innerhalb einer Schleife das Geschehen zu kontrollieren.
<script language="JavaScript"> <!-- var i = 0; while (i < 6) { if (i == 3) break; i++; } alert("i = " + i); // --> </script> |
Mit break können Sie eine Schleife sofort beenden. Dazu müssen Sie innerhalb des Schleifenkörpers eine if-Abfrage notieren und abhängig davon das Wort break als Anweisung notieren. Im Beispiel bricht die Schleife bereits ab, wenn i den Wert 3 hat, obwohl laut Schleifenbedingung das Hochzählen bis 6 erlaubt.
<script language="JavaScript"> <!-- var i = 0; while (i < 6) { Ende: if (i == 3) { alert("Das war's, denn i ist gleich " + i); break Ende; } i++; } // --> </script> |
Dies ist eine besondere Variante von break. Sie können vor einer Abfrage, von der Sie eine break-Anweisung abhängig machen, ein "Label" notieren. Das ist ein selbstvergebener Name mit einem Doppelpunkt dahinter, im Beispiel Ende:. Hinter dem Wort break können Sie dann den Namen des Labels angeben. So stellen Sie im Beispiel sicher, daß sich die break-Anweisung auf jeden Fall auf jene if-Abfrage bezieht, in der abgefragt wird, ob i gleich 3 ist. In einfachen Fällen wie im obigen Beispiel ist das eigentlich überflüssig. Aber behalten Sie die Möglichkeit im Auge, falls Sie einmal verschachtelte if-Abfragen innerhalb von Schleifen programmieren und dort auch break-Anweisungen benutzen. Beachten Sie jedoch, daß diese Variante der break-Anweisung JavaScript 1.2 ist und bei Netscape unter Version 4.x und MS Internet Explorer unter 4.x zu einer Fehlermeldung führt, da die Syntax mit dem Doppelpunkt für das Label dort nicht bekannt ist.
<script language="JavaScript"> <!-- var i = 0, j = 0; while (i < 6) { i++; if (i == 3) continue; j++; } alert("i ist gleich " + i + " und j ist gleich " + j); </script> |
Mit continue erzwingen Sie sofort den nächsten Schleifendurchlauf. Nachfolgende Anweisungen innerhalb der Schleife werden bei diesem Schleifendurchlauf nicht mehr ausgeführt. Im Beispiel werden zwei Zähler i und j bei jedem Schleifendurchlauf um 1 erhöht. Wenn i gleich 6 ist, wird die Schleife abgebrochen. Zwischendurch hat i auch mal den Wert 3. Dieser Fall wird mit einer if-Abfrage behandelt. Wenn i gleich 3 ist, wird sofort der nächste Schleifendurchgang gestartet. Die Anweisung j++; wird dadurch in diesem Schleifendurchlauf nicht mehr ausgeführt. Am Ende hat dadurch i den Wert 6 und j nur den Wert 5.
weiter: | Reservierte Wörter |
zurück: | Bedingte Anweisungen (if-else/switch) |