continue;
continue kann ebenfalls mit einer Sprungmarke verwendet werden:
continue Sprungmarke;
Die continue-Anweisung kann in beiden Formen, also mit und ohne Sprungmarke, nur innerhalb eines Schleifenkörpers verwendet werden. Einsätze an anderer Stelle lösen Syntaxfehler aus.
Durch die Ausführung einer continue-Anweisung wird der aktuelle Durchlauf der umschließenden Schleife abgebrochen und der nächste Durchlauf begonnen. Das hat je nach Schleifenart unterschiedliche Folgen:
In einer while-Schleife wird der am Anfang der Schleife festgelegte Ausdruck erneut geprüft, und der Schleifeninhalt wird – sofern der Ausdruck true ergibt – wieder von Beginn an ausgeführt.
Bei einer do/while-Schleife springt die Ausführung ans Ende der Schleife, wo die Schleifenbedingung geprüft wird, bevor die Schleife gegebenenfalls erneut ausgeführt wird.
Bei einer for-Schleife wird der Ausdruck Inkrementierung ausgewertet, bevor eine erneute Prüfung des Testausdrucks darüber entscheidet, ob ein weiterer Durchlauf erfolgen soll.
In einer for/of- oder for/in-Schleife beginnt die Schleife von vorn, wobei der angegebenen Variablen der nächste aufzählbare Wert oder Eigenschaftsname zugewiesen wird.
Beachten Sie das unterschiedliche Verhalten der continue-Anweisung bei while- und for-Schleifen: Während eine while-Schleife unmittelbar zur Bedingung zurückkehrt, wird in einer for-Schleife erst der Inkrementierungsausdruck auswertet, bevor die Bedingung geprüft wird. Weiter oben haben wir uns das Verhalten einer for-Schleife anhand einer gleichwertigen while-Schleife angesehen. Da sich die continue-Anweisung jedoch bei diesen beiden Schleifen unterschiedlich verhält, kann man eine for-Schleife mit einer while-Schleife alleine nicht vollständig simulieren.
Das folgende Beispiel zeigt eine unbenannte continue-Anweisung, mit deren Hilfe der Rest der aktuellen Iteration einer Schleife übersprungen wird, wenn ein Fehler auftritt:
for(let i = 0; i < data.length; i++) {
if (!data[i]) continue; // Fortsetzung mit undefinierten Daten nicht möglich.
total += data[i];
}
Wie auch die break-Anweisung kann continue bei verschachtelten Schleifen zusammen mit einer Label-Angabe verwendet werden, sofern die Schleife, die neu gestartet werden soll, nicht die innerste umschließende Schleife ist. Und wie bei break darf zwischen dem Schlüsselwort continue und der Sprungmarke kein Zeilenumbruch stehen.
5.5.4return
Rufen Sie sich bitte noch einmal ins Gedächtnis, dass Funktionsaufrufe Ausdrücke sind und alle Ausdrücke Werte haben. Eine return-Anweisung innerhalb einer Funktion legt den Wert fest, den Aufrufe dieser Funktion erhalten. Hier die Syntax der return-Anweisung:
return Ausdruck;
Eine return-Anweisung darf nur innerhalb eines Funktionskörpers erscheinen. An anderer Stelle führt das zu einem Syntaxfehler. Wird die return-Anweisung ausgeführt, liefert die Funktion, in der sie steht, den Wert von Ausdruck an den Aufrufer zurück, zum Beispiel:
function square(x) { return x*x; } // Eine Funktion mit einer return-Anweisung.
square(2) // => 4
Enthält eine Funktion keine return-Anweisung, werden einfach alle Anweisungen im Funktionskörper ausgeführt, bis das Ende der Funktion erreicht ist und die Kontrolle wieder an den Aufrufer übergeben wird. In diesem Fall wird der Aufrufausdruck zu undefined ausgewertet. Obwohl die return-Anweisung häufig als letzte Anweisung in einer Funktion steht, muss das nicht so sein: Eine Funktion gibt bei der Ausführung einer return-Anweisung die Kontrolle an den Aufrufer zurück, auch wenn im Funktionskörper noch weitere Anweisungen folgen.
return kann auch ohne Ausdruck verwendet werden, damit die Funktion undefined an den Aufrufer zurückliefert, zum Beispiel:
function displayObject(o) {
// Sofortige Rückkehr zum Aufrufer, wenn das Argument null oder undefiniert ist.
if (!o) return;
// Hier folgt der Rest der Funktion.
}
Aufgrund der automatischen Ergänzung von Semikola in JavaScript (siehe 2.6) darf zwischen dem Schlüsselwort return und dem folgenden Ausdruck kein Zeilenumbruch erfolgen.
5.5.5yield
Die yield-Anweisung ähnelt stark der return-Anweisung, wird aber nur in ES6-Generatorfunktionen verwendet (siehe 12.3), um den nächsten Wert in der generierten Wertfolge zu erzeugen, ohne tatsächlich zurückzukehren:
// Eine Generatorfunktion, die einen Bereich von ganzen Zahlen ergibt.
function* range(from, to) {
for(let i = from; i <= to; i++) {
yield i;
}
}
yield lässt sich erst im Zusammenhang mit Iteratoren und Generatoren genau verstehen, die allerdings erst in Kapitel 12 behandelt werden. Der Vollständigkeit halber habe ich yield hier aber bereits berücksichtigt. (Formal betrachtet, ist yield eher ein Operator als eine Anweisung, wie in 12.4.2 dargestellt.)
5.5.6throw
Eine Ausnahme (Exception) ist ein Signal, das anzeigt, dass ein außergewöhnlicher Zustand oder Fehler aufgetreten ist. Löst man eine Ausnahme aus, signalisiert man damit einen solchen Fehler bzw. außergewöhnlichen Zustand. (Im Englischen »wirft« man eine Ausnahme: to throw an exception.) Ausgelöste Ausnahmen fängt man ab (to catch an exception), um sie zu behandeln – also um Handlungen vorzunehmen, die erforderlich oder geeignet sind, um die Ausnahmesituation zu beheben. In JavaScript werden Ausnahmen ausgelöst, wenn ein Laufzeitfehler auftritt oder wenn das Programm sie mithilfe der throw-Anweisung explizit auslöst. Ausnahmen werden mit der try/catch/finally-Anweisung abgefangen, die im nächsten Abschnitt beschrieben wird.
Die throw-Anweisung hat folgende Syntax:
throw Ausdruck;
Ausdruck kann zu einem Wert eines beliebigen Typs ausgewertet werden. Sie können eine Zahl verwenden, die einen Fehlercode repräsentiert, oder einen String, der eine lesbare Fehlermeldung enthält. Die Klasse Error und ihre Unterklassen werden verwendet, wenn der JavaScript-Interpreter einen Fehler auslöst – Sie können sie aber auch selbst benutzen. Ein Error-Objekt hat eine name-Eigenschaft, die den Fehlertyp angibt, und eine message-Eigenschaft, die den String enthält, der der Konstruktorfunktion übergeben wurde. Hier eine Beispielfunktion, die ein Error-Objekt »wirft«, wenn sie mit einem ungültigen Argument aufgerufen wird:
function factorial(x) {
// Wenn das Eingabeargument ungültig ist, wird eine Ausnahme ausgelöst!
if (x < 0) throw new Error("x must not be negative");
// Andernfalls berechnen wir einen Wert und kehren auf übliche Weise zurück.
let f;
for(f = 1; x > 1; f *= x, x--) /* l eer */ ;
return f;
}
factorial(4)