Kontrollstrukturen
In den seltendsten Fällen reicht es aus, dass ein Programm Anweisung für Anweisung abläuft. Oft sollen bestimmte Anweisungen mehrfach ausgeführt werden bis ein bestimmter Zustand eintritt. Oder es müssen innerhalb des Programms Entscheidungen getroffen werden, nach denen sich der weitere Programmablauf zu richten hat. Für diese Fälle stellt JavaScript sogenannte Kontrollstrukturen zur Verfügung. Das sind Schleifen, von denen es verschiedene Typen gibt, und bedingte Verzweigungen.
Wenn der Anweisungsblock einer Kontrollstruktur lediglich eine Anweisung enthält, können die geschweiften Klammern weggelassen werden, in allen anderen Fällen sind sie zwingend.
For-Schleifen fürhren ihren Anweisungsblock eine festgelegte Anzahl von Malen aus. Sie beginnen mit den Schlüsselwort for, gefolgt von runden und dem Anweisungsblock in geschweiften Klammern.
Innerhalb der runden Klammern werden die Schleifendurchläufe mit einem Zähler definiert. Dabei werden drei Anweisungen hintereinander in den Klammern untergebracht:
Hier ein Beispiel:
for (var i=0; i<10; i++) {
Anweisungen...
}
Zuerst wird eine Zählervariable vereinbart, hier i, und auf den Anfangswert 0 gesetzt. Die zweite Anweisung besagt, dass der Anweisungsblock so oft wiederholt werden soll, solange die Bedingung i<10 wahr ist. Die dritte Anweisung setzt den Zähler i bei jedem Durchlauf um Eins hoch. Die letzte Anweisung wird nicht mit einem Semikolon abgeschlossen.
Wie oft wird bei folgendem Beispiel die Schleife durchlaufen?
for (var i=60; i>10; i-=10) {
Anweisungen...
}
Die Zählervariable läßt sich auch innerhalb der Schleife als Rechengröße verwenden. Folgendes Beispiel errechnet alle Quadratzahlen für 0 bis 10:
for (var i=1; i<11; i++) {
quadrat = i * i;
}
Siehe hierzu auch Beispiel 8.
Manchmal ist es nicht schon zu Beginn bekannt, wie oft ein Anweisungsblock wiederholt werden muss. Je nach Zustand im Programm tritt eine Abbruchbedingung früher oder später ein. Dafür gibt es diesen while-Schleifentyp, mit dem es allerdings auch sehr leicht möglich ist "Endlosschleifen", das sind Schleifen die nie abgebrochen werden, zu fabrizieren. Also ist unbedingt darauf zu achten, das die Abbruchbedingung hier in jedem Fall irgendwann einmal erfüllt wird. Die Syntax lautet folgendermaßen:
do {
Anweisungen...
} while (Bedingung)
Der Anweisungsblock wird hier mindestens einmal ausgeführt und dann erst wird die Bedingung getestet. Das ist wichtig. Wie beim nächsten Schleifentyp zu sehen ist, gibt es auch Schleifen, die ihren Anweisungsblock nicht unbedingt einmal abarbeiten. Ist die Bedingung wahr springt das Programm an den Anfang der Schleife und der Block wird erneut ausgeführt und so fort. Es muß also innerhalb des Anweisungsblocks gewährleistet werden, daß die Bedigung irgendwann einmal das Ergebnis false liefert.
Siehe hierzu auch Beispiel 9.
Diese Schleife ist die zweite Variante des while-Typs. Der Unterschied zur vorherigen Version besteht darin, dass die Bedingung zu Beginn des Anweisungsblocks abgefragt wird. Das hat zur Folge, dass der Anweisungsblock nicht zwingend einmal abgearbeitet wird. Ist die Bedigung gleich zu Beginn false, wird der Anweisungsblock der Schleife ignoriert.
while (Bedingung) {
Anweisungen...
}
In einigen Fällen ist es erforderlich eine Schleife abzubrechen und direkt mit dem Programmcode nach der Schleife fortzufahren. Dies kann durch folgende Anweisung innerhalb der Schleife realisiert werden:
break;
Manchmal überläßt man den Abbruch auch ausschließlich dem break und konstruiert die Schleife als Endlosschleife, indem ihre Bedingung unveränderlich auf true gesetzt wird. Diesen unschönen Programmierstil demonstriert folgendes Beispiel:
while (true) {
Anweisungen...
break;
Anweisungen...
}
Ein anderer Fall ist es, wenn einen Teil des Anweisungsblockes der Schleife übersprungen und direkt zum nächsten Schleifendurchlauf übergegangen werden soll. Auch dafür gibt es ein Schlüsselwort, das als Anweisung innerhalb der Schleife verwendet werden kann:
continue;
Vielleicht die wichtigste Kontrollstruktur von Programmiersprachen ist die bedingte Verzweigung. Sie bietet die Möglichkeit anhand des Ergebnisses einer Bedigung, einen Programmcode auszuführen oder nicht. Das Schlüsselwort hierfür ist if, gfolgt von der Bedingung und dem Anweisungsblock.
if (Bedingung) {
Anweisungen...
}
Wenn die Bedingung zutrifft (true ergibt) werden die Anweisungen ausgeführt, wenn sie nicht zutrifft, werden sie ignoriert.
Eine Erweiterung dieser Verzweigung bietet die Möglichkeit mit dem Schlüsselwort else anzugeben, was geschehen soll, wenn die Bedingung nicht zutrifft.
if (Bedingung) {
Anweisungen...
}
else {
Anweisungen...
}
Sind die Anweisungen einzeilig, kann auf die geschweiften Klammern verzichtet werden.
if (Bedingung)
Anweisung1
else
Anweisung2
Wie bei den Operatoren gibt es auch für die Verzeigungen eine Kurzform, die besondes gut eingesetzt werden kann, wenn die Anweisungen lediglich einzeilig sind:
(Bedingung) ? Anweisung1 : Anweisung2
Der Nachteil der if-Verzweigung ist, daß sie jeweils nur einen Fall abhandeln kann. Stehen mehrere Möglichkeiten zur Verfügung würden sehr lange if-else-Ketten entstehen. Besser ist es hier eine switch-Anweisung zu verwenden. Switch betrachtet eine Variable und verzweigt dann in den case-Abschnitt, der dem Zustand der Variablen entspricht.
Die Syntax lautet folgendermaßen:
switch (Variable) {
case wert1:
Anweisungen...
break
case wert2:
Anweisungen...
break
case wert3:
Anweisungen...
break
usw.
default:
Anweisungen...
}
JavaScript arbeitet die Anweisungen ab, die in dem case-Block stehen, der der Variablen entspricht. Dabei ist darauf zu achten, daß jeder Block mit einnem break abgeschlossen werden muss, da sonst die folgenden Anweisungen auch abgearbeitet werden würden.
default wird ausgeführt, wenn kein passender case-Block zur Verfügung steht. Der default-Block ist optional.