
Was ist der Strict Mode?
Der Strict Mode kam mit ECMAScript 5 (ES5). Er ist eine strengere Variante von JavaScript, die Fehler meldet, statt sie stillschweigend zu schlucken. Weist du im normalen Modus einer Variablen einen Wert zu, ohne sie mit var zu deklarieren (etwa x = 5. ), nimmt der JavaScript-Interpreter an, du meintest eine globale Variable, und legt sie an, falls es sie noch nicht gibt.
Außerdem können veraltete Funktionen im Strict Mode Fehler auslösen. Damit senkt der Strict Mode die Zahl der Bugs und verbessert Sicherheit und Gesamtleistung deiner Anwendung.
Den Strict Mode aktivieren
Zum Aktivieren genügt es, die Zeichenkette „use strict“ an den Anfang deines Skripts zu setzen, wie im folgenden Beispiel:
"use strict";
x = 5; // ReferenceError: x is not defined
console.log(x);Steht die Direktive „use strict“ in der ersten Zeile deines JavaScript-Programms, gilt der Strict Mode für das gesamte Skript. Du kannst ihn aber auch nur innerhalb einer Funktion einschalten:
x = 5;
console.log(x); // 5
function sayHello() {
"use strict";
str = "Hello World!"; // ReferenceError: str is not defined
console.log(str);
}
sayHello();Gut zu wissen: Die Direktive „use strict“ wird nur am Anfang eines Skripts oder einer Funktion erkannt. Alle modernen Browser unterstützen sie, außer Internet Explorer 9 und älter. Browser ohne Unterstützung ignorieren die Direktive stillschweigend und werten das JavaScript im normalen Modus aus.
Allgemeine Einschränkungen im Strict Mode
Der Strict Mode ändert sowohl die Syntax als auch das Laufzeitverhalten. Die folgenden Abschnitte gehen die allgemeinen Einschränkungen durch, die im Strict Mode gelten:
Nicht deklarierte Variablen sind nicht erlaubt
Wie du bereits weißt, müssen im Strict Mode alle Variablen deklariert sein. Weist du einem Bezeichner einen Wert zu, der keine deklarierte Variable ist, bekommst du einen ReferenceError.
"use strict";
function doSomething() {
msg = "Hello world!"; // ReferenceError: msg is not defined
return msg;
}
console.log(doSomething());Eine Variable oder Funktion zu löschen ist nicht erlaubt
Versuchst du im Strict Mode, eine Variable oder eine Funktion zu löschen, wird ein Syntaxfehler ausgelöst. Im normalen Modus scheitert derselbe Versuch stillschweigend, und der delete-Ausdruck wird zu false ausgewertet.
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxErrorGenauso liefert der Versuch, im Strict Mode eine Funktion zu löschen, einen Syntaxfehler:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxErrorDoppelte Parameternamen sind nicht erlaubt
Im Strict Mode gibt es einen Syntaxfehler, sobald eine Funktionsdeklaration zwei oder mehr Parameter mit demselben Namen hat. Im normalen Modus passiert nichts.
"use strict";
function test(a, a) { // SyntaxError
return a * a;
}
console.log(square(2, 2));eval() kann den Gültigkeitsbereich nicht mehr verändern
Im Strict Mode kann der an eval() übergebene Code aus Sicherheitsgründen keine Variablen der Umgebung mehr deklarieren oder ändern und dort auch keine Funktionen definieren, wie es im normalen Modus möglich ist.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not definedeval und arguments taugen nicht als Bezeichner
Im Strict Mode gelten die Namen eval und arguments als Schlüsselwörter. Sie lassen sich deshalb nicht als Variablennamen, Funktionsnamen, Parameternamen und so weiter verwenden.
"use strict";
var eval = 10; // SyntaxError
console.log(eval);Die Anweisung with ist nicht erlaubt
Im Strict Mode ist die Anweisung with nicht erlaubt. Die Anweisung with hängt die Eigenschaften und Methoden eines Objekts an den aktuellen Gültigkeitsbereich. Verschachtelte Anweisungen innerhalb von with können die Eigenschaften und Methoden des Objekts damit direkt ansprechen, ohne es zu nennen.
"use strict";
// Ohne with
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
// Mit with
var radius2 = 5;
with(Math) { // SyntaxError
var area2 = PI * radius2 * radius2;
} In eine schreibgeschützte Eigenschaft zu schreiben ist nicht erlaubt
Im Strict Mode löst die Zuweisung an eine nicht beschreibbare Eigenschaft, an eine reine Getter-Eigenschaft oder an eine nicht vorhandene Eigenschaft einen Fehler aus. Im normalen Modus scheitern diese Versuche stillschweigend.
"use strict";
var personne = {name: "Damien", age: 25};
Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeErrorNeue Eigenschaften auf einem nicht erweiterbaren Objekt sind nicht erlaubt
Im Strict Mode lösen auch Versuche, neue Eigenschaften auf nicht erweiterbaren oder nicht vorhandenen Objekten anzulegen, einen Fehler aus. Im normalen Modus scheitern sie stillschweigend.
"use strict";
var person = {name: "Damien", age: 25};
console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); // das Objekt personne sperren
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeErrorOktalzahlen sind nicht erlaubt
Im Strict Mode sind Oktalzahlen (Ziffern mit vorangestellter Null, etwa 010 oder 0377) nicht erlaubt. Im normalen Modus unterstützen sie dagegen alle Browser. In ES6 gibt es Oktalzahlen wieder, mit dem Präfix 0o, also 0o10, 0o377 und so weiter.
"use strict";
var x = 010; // SyntaxError
console.log(parseInt(x));An den Beispielen oben siehst du deutlich, wie der Strict Mode dir hilft, verbreitete Fehler zu vermeiden, die beim Schreiben eines JavaScript-Programms sonst oft unbemerkt bleiben.
Für die Zukunft reservierte Schlüsselwörter sind nicht erlaubt
Der Strict Mode schränkt die Verwendung der Schlüsselwörter ein, die für die Zukunft reserviert sind.
Nach dem aktuellen Standard ECMAScript 6 (oder ES6) gelten im Strict Mode diese Schlüsselwörter als reserviert: await, implements, interface, package, private, protected, public und static. Für beste Kompatibilität solltest du reservierte Wörter ohnehin nicht als Variablen- oder Funktionsnamen in deinem Programm verwenden.
Tipp: Reservierte Wörter, auch Schlüsselwörter genannt, sind besondere Wörter, die zur Syntax von JavaScript gehören, zum Beispiel
var,if,for,functionund so weiter.
···


