Название | JavaScript – Das Handbuch für die Praxis |
---|---|
Автор произведения | David Flanagan |
Жанр | Математика |
Серия | |
Издательство | Математика |
Год выпуска | 0 |
isbn | 9783960104926 |
»Nackte« catch-Klausel
Gelegentlich verwendet man eine catch-Klausel nur, um die Weitergabe einer Ausnahme zu erkennen und zu stoppen, ohne sich für die Art oder den Wert der Ausnahme zu interessieren. In ES2019 und später können Sie in solch einem Fall die Klammern und den Identifier weglassen und das Schlüsselwort catch »nackt« verwenden. Hier ein Beispiel:
// Wie JSON.parse(), aber es wird undefined zurückgegeben anstatt eines
// Fehlers.
function parseJSON(s) {
try {
return JSON.parse(s);
} catch {
// Etwas ging schief, aber es ist uns egal, was.
return undefined;
}
}
5.6Verschiedene Anweisungen
Dieser Abschnitt beschreibt die verbleibenden drei JavaScript-Anweisungen – with, debugger und "use strict".
5.6.1with
Die Anweisung with führt einen Codeblock aus, als wären die Eigenschaften eines angegebenen Objekts Variablen im blockbezogenen Geltungsbereich dieses Codes. Sie hat folgende Syntax:
with (Objekt)
Anweisung
Diese Anweisung erstellt einen temporären Geltungsbereich mit den Eigenschaften des Objekts als Variablen und führt dann die Anweisung innerhalb dieses Geltungsbereichs aus.
Im strict-Modus ist die with-Anweisung verboten (siehe 5.6.3) und sollte im nichtstrikten Modus als veraltet betrachtet werden; vermeiden Sie es also, sie einzusetzen, wann immer es möglich ist. JavaScript-Code, in dem with verwendet wird, lässt sich nur schwer optimieren und läuft wahrscheinlich deutlich langsamer als gleichwertiger Code, der ohne with geschrieben wurde.
Üblicherweise wird die with-Anweisung benutzt, um die Arbeit mit tief verschachtelten Objekthierarchien zu erleichtern. Bei clientseitigem JavaScript müssen Sie beispielsweise hin und wieder Ausdrücke wie den folgenden einsetzen, um auf die Elemente eines HTML-Formulars zuzugreifen:
document.forms[0].address.value
Benötigen Sie derartige Ausdrücke häufiger, können Sie with verwenden, um auf die Eigenschaften des Formularobjekts zuzugreifen:
with(document.forms[0]) {
// Jetzt können Sie direkt auf Formularelemente zugreifen. Zum Beispiel:
name.value = "";
address.value = "";
email.value = "";
}
Das verringert den Tippaufwand: Sie müssen den Namen der Formulareigenschaften nicht mehr jeweils document.forms[0] voranstellen. Genauso leicht lässt sich die with-Anweisung natürlich vermeiden, indem man den vorhergehenden Code umformuliert:
let f = document.forms[0];
f.name.value = "";
f.address.value = "";
f.email.value = "";
Wenn Sie mit const oder let oder var eine Variable oder Konstante innerhalb des Körpers einer with-Anweisung deklarieren, wird damit übrigens nur eine gewöhnliche Variable erzeugt und keine neue Eigenschaft innerhalb des angegebenen Objekts definiert.
5.6.2debugger
Die Anweisung debugger bewirkt normalerweise von sich aus nichts. Läuft aber parallel ein Debugger-Programm, kann eine Implementierung eine beliebige Debugging-Aktion durchführen (muss es aber nicht). In der Praxis verhält sich diese Anweisung wie ein Breakpoint: Die Ausführung des JavaScript-Codes wird angehalten, und Sie können mit einem Debugger Werte von Variablen ausgeben, den Aufrufstapel untersuchen und so weiter. Stellen Sie sich vor, in Ihrer Funktion f() wird eine Ausnahme ausgelöst, weil sie mit einem undefinierten Argument aufgerufen wird. Sie können aber nicht herausfinden, wo der Aufruf der Funktion erfolgt. Um bei der Behebung dieses Problems weiterzukommen, könnten Sie f() in folgender Weise ergänzen:
function f(o) {
if (o === undefined) debugger; // Temporäre Zeile für Debugging-Zwecke.
… // Hier folgt der Rest der Funktion.
}
Wird f() jetzt ohne Argument aufgerufen, wird die Ausführung gestoppt, sodass Sie den Debugger verwenden können, um den Aufrufstapel zu untersuchen und herauszufinden, woher dieser fehlerhafte Aufruf stammt.
Beachten Sie bitte, dass es nicht ausreicht, dass ein Debugger verfügbar ist. Er muss aktuell auch laufen, denn die Anweisung debugger startet den Debugger nicht etwa automatisch. Wenn Sie einen Webbrowser verwenden und die Entwicklerwerkzeuge geöffnet sind, erzeugt diese Anweisung jedoch einen Breakpoint.
5.6.3"use strict"
"use strict" ist eine Direktive, die in ES5 eingeführt wurde. Direktiven sind keine Anweisungen (sind ihnen aber ähnlich genug, um "use strict" hier ebenfalls zu behandeln). Es gibt zwei wichtige Unterschiede zwischen der "use strict"-Direktive und regulären Anweisungen:
Sie enthält keine Schlüsselwörter: Die Direktive ist lediglich eine Ausdrucksanweisung, die aus einem speziellen String-Literal (in einfachen oder doppelten Anführungszeichen) besteht.
"use strict" darf nur am Anfang eines Skripts oder eines Funktionskörpers stehen, muss also jeder echten Anweisung vorausgehen.
Die "use strict"-Direktive zeigt an, dass der nachfolgende Code (eines Skripts oder einer Funktion) strikter Code ist. Code auf der obersten Ebene eines Skripts, der also nicht in einer Funktion steht, ist strikter Code, wenn das Skript eine "use strict"-Direktive enthält. Ein Funktionskörper ist strikter Code, wenn er in striktem Code definiert wird oder wenn er selbst eine "use strict"-Direktive enthält. Code, der einer eval()-Methode übergeben wird, ist dann strikter Code, wenn eval() aus striktem Code aufgerufen wird oder wenn er selbst eine "use strict"-Direktive enthält. Neben Code, der ausdrücklich als strikt deklariert wird, ist jeglicher Code in einem Klassenkörper (siehe Kapitel 9) oder in einem ES6-Modul (siehe 10.3) automatisch strikter Code. Liegt Ihr gesamter JavaScript-Code in Modulform vor, ist automatisch alles strikter Code, und Sie werden niemals eine explizite "use strict"-Direktive verwenden müssen.
Strikter Code wird im strikten Modus ausgeführt. Der strict-Modus ist eine beschränkte Untermenge von JavaScript, behebt einige relevante Mängel der Sprache und bietet eine strengere Fehlerprüfung sowie erhöhte Sicherheit. Da der strict-Modus nicht der Standardmodus ist, wird alter JavaScript-Code, der noch die mangelhaften Legacy-Funktionen der Sprache verwendet, weiterhin korrekt ausgeführt. Zwischen dem strict-Modus und dem normalen Modus gibt es folgende Unterschiede (die ersten drei sind besonders wichtig):
Die with-Anweisung ist im strikten Modus nicht erlaubt.
Im strict-Modus müssen alle Variablen deklariert werden: Wenn Sie einem Identifier einen Wert zuweisen, der keinen deklarierten Variablen, Funktionen, Funktionsparametern, Parametern einer catch-Klausel oder Eigenschaften des globalen Objekts entspricht, löst das