Feb 2009

Iterationen oder Schleifen

 
 

Eine Iteration besteht aus Anweisungen, die wiederholt durchgeführt werden, solang eine Bedingung zutrifft. Javascript unterstützt for-, for … in-, do while- und while-Schleifen sowie label (label ist keine Schleifenanweisung, wird aber häufig in Schleifen benutzt).

Die for-Anweisung

for ((anfänglicher Ausdruck); Bedingung; Increment-Anweisung) {
   Anweisungen; 
}

Eine for-Anweisung basiert auf einer Indexvariablen und führt Anweisungen inkrementel durch, bis eine Bedingung nicht mehr zutrifft. Anders als die Varianten der while-Anweisung wird die Variable innerhalb der Increment-Anweisung automatisch herauf- oder heruntergezählt und im Anweisungsblock der for-Anweisung muss keine Anweisung für das sichere Ende der Schleife sorgen. Alle „Zutaten“ sind am Anfang der Schleife in einer Klammer gelistet und gestalten die for-Anweisung besonders gut lesbar.

  • Der anfängliche Ausdruck initialisiert einen oder mehrere Zähler, fast immer auf der Initialisierung einer Zählvariablen, z.B. i=0;, kann aber auch eine Variable deklarieren (var i=0;), erlaubt aber auch eine beliebig komplexe Syntax.
  • Die Bedingung legt fest, wann die Zielgröße der Zählvariablen erreicht ist, z.B. i<10;.
  • Die Increment-Anweisung erhöht die Zählvariable oder zählt sie herunter, z.B. i++ oder durch eine komplexe Funktion wie myFunction(i).

Die for-Anweisung wird nach dem folgenden Schema durchgeführt:

  1. Der anfängliche Ausdruck wird ausgeführt.
  2. Die Bedingung wird evaluiert. Wenn der Wert der Bedingung true ist, werden die Anweisungen in der for-Anweisung ausgeführt. Wenn der Wert der Bedingung false liefert, endet die for-Anweisung. Wenn keine Bedingung notiert ist, gilt die Bedingung als true.
  3. Die Anweisungen werden durchgeführt.
  4. Die Increment-Anweisung wird ausgeführt und die Kontrolle wird an Schritt 2 übergeben.
var text = '';
var zahl = 10;
for (var i=0; i<=zahl; i++) {
   text = text + i + ' mal 3 ist ' + i*3 + '\n';
}
alert (text);

Die Variable text speichert die Aufgabe und das Ergebnis jedes Laufs durch den Block der for-Anweisung. Die Variable zahl gibt vor, wie oft der for-Block aufgerufen wird.

for-Anweisungen lassen sich ineinander verschachteln.

for-Anweisungen beginnen nicht notwendigerweise mit dem Index 0 um das Increment muss nicht notwendigerweise 1 sein. Ein Skript würde den Block der folgenden for-Anweisung vier Mal durchführen: für i=3, i=8, i=13 und i=18.

var index = 3;
var jump = 5; 
for (var i=index; i<23; i+=jump {   // oder i=i+jump
   // Anweisungen 
}

Am Rande: Ein Fehler in Safari 1.3 erlaubt diese Form des Inkrements – i+=jump – nicht und das Skript würde in Safari zu einer Endlosschleife führen.

Auch wenn hier ähnliche Beispiele für die Anwendung der for- und der Varianten der while-Anweisung benutzt werden, sind for- und while-Schleifen nicht ohne Weiteres austauschbar. for-Anweisungen kommen insbesondere zum Einsatz, wenn die Anzahl von Durchläufen im Vorherein bekannt ist – z.B. bei der Verarbeitung von Arrays, bei denen die Anzahl von Arrayelementen durch die Eigenschaft length bekannt ist. while-Anweisungen kommen zum Einsatz, wenn der Anweisungsblock eine unbekannte Anzahl von Durchläufen ausgeführt werden soll.

do ... while

do {
   Anweisungen;
} while (Bedingung)

do ... while wiederholt Anweisungen, bis eine Bedingung nicht mehr zutrifft – false wird.

Die Anweisungen werden einmal durchgeführt, bevor die Bedingung geprüft wird. Wenn die Bedingung true liefert, werden die Anweisungen erneut ausgeführt. Am Ende jedes Laufs durch die Schleife wird die Bedingung abgefragt. Wenn die Bedingung false liefert, endet die Ausführung und die Kontrolle wird an die Anweisungen hinter der do ... while-Anweisungen übergeben.

var x = 0;
var zahl = 10; 
var text = "";
do {
   var einmalEins = 3 * x;
   text = text + x + ' mal 3 ist ' + einmalEins + "\n"; 
   x = x + 1;
} while (x <= zahl);
alert (text);

while

while (Bedingung) {
   Anweisungen;
}

Eine while-Anweisung führt ihre Anweisungen aus, solange die Bedingung true liefert. Wenn die Bedingung bei der ersten Abfrage nicht true liefert, werden die Anweisungen in der while-Schleife gar nicht erst ausgeführt.

Wenn die Bedingung false liefert, endet die Ausführung der while-Schleife und die Kontrolle wird an die Anweisungen nach der while-Schleife übergeben.

Auf jeden Fall muss sichergestellt werden, dass die Bedingung false wird, ansonsten entsteht eine unendliche Schleife.

Diese Schleife wird vier Mal durchlaufen:

var x = 1; 
while (x < 5) {
   alert(x + 'ter Durchlauf');
   x = x + 1;
}

Das Skript initialisiert die Variable x auf den Wert 1, bevor die while-Anweisung ausgeführt wird. Die while-Anweisung prüft die Bedingung (x < 5). Da 1 kleiner als 5 ist, durchläuft das Skript die while-Schleife ein erstes Mal.

Die letzte Anweisung im Block der while-Schleife zählt das x um eins herauf, so dass die Schleifenbedingung nach dem vierten Durchlauf nicht mehr zutrifft. In jeder while-Schleife muss die Schleifenbedingung geändert werden – ansonsten würde die Schleife endlos laufen oder der Browser abstürzen.

for…in-Anweisung

for (elem in MyObject) {
   Anweisungen;
}

Die for…in-Anweisung ist ein Sonderfall der for-Anweisung und dient allein der Iteration durch Arrays oder Objekte. Bei einem Array durchläuft die for…in-Anweisung alle Elemente eines Arrays. Bei Objekten durchläuft die for…in-Anweisung alle Eigenschaften eines Objekts. Das Schöne an der for…in-Anweisung ist, dass die Anzahl der Elemente nicht zuvor festgestellt werden muss und dass keine Endlos-Schleife zu befürchten ist.

var text = "";
for (elem in window.navigator) {
   text = text + window.navigator[elem] + '\n';
}
alert(text);

with-Anweisung

Die with-Anweisung soll Schreibarbeit sparen und den Zugriff auf Objekt-Elemente übersichtlicher gestalten. Objektbandwürmer wie

baba.bumbum.hamma.sumsum.niknak.elem1 = x;
baba.bumbum.hamma.sumsum.niknak.elem2 = y;

verkürzt die with-Anweisung zu

with (baba.bumbum.hamma.sumsum.niknak) {
   elem1 = x; 
   elem2 = y;
}

und schon sieht alles viel harmloser aus.

Leider verbirgt die friedliche Oberfläche, was hier tatsächlich angesprochen wird: baba.bumbum.hamma.sumsum.niknak.elem1 oder einer globale Variable elem1? In dieser Hinsicht bewirkt eine Variable dieselbe Vereinfachung, sorgt aber gleichzeitig dafür, dass der Kontext auf jeden Fall korrekt und bekannt ist.

var myObj = baba.bumbum.hamma.sumsum.niknak;
myObj.elem1 = x;
myObj.elem2 = y; 

entlastet genauso von der Schreibarbeit wie die with-Anweisung, stellt aber gleichzeitig sicher, welches elem1 bzw. elem2 hier gemeint ist.

   


Copyright © 2000 - 2010 Media Engineering Alle Rechte vorbehalten
Design + Programmierung Media Engineering U. Häßler 47506 Neukirchen-Vluyn • Impressum und Nutzungsbestimmungen