Der strenge Modus ist eine neue Funktion von ECMascript 5. Sie ermöglicht es Ihnen, das gesamte Programm oder eine Funktion in einem "strengen" Betriebskontext zu platzieren. Dieser strenge Kontext verhindert bestimmte Operationen und wirft mehr Ausnahmen aus.
Während ECMascript 5 mit ECMAScript 3 rückwärts kompatibel ist, sind im strengen Modus alle Merkmale, die in ECMascript 3 nicht bevorzugt werden, deaktiviert (oder einen Fehler geworfen) und nicht kompatibel.
Aktivieren Sie den strengen Modus haben die folgenden Vorteile:
1. Fang einige Programmierfehler und werfen Sie Ausnahmen.
2. Verhindern Sie, dass einige relativ "unsichere" Operationen (z. B. Zugriff auf globale Variablen) durchgeführt werden, und Ausnahmen werden ausgewiesen.
3. Deaktivieren Sie einige verwirrende Funktionen.
Die meisten Informationen zum strengen Modus finden Sie auf Seite 223 des ES5 -Code [PDF].
(Hinweis: Der strenge Modus von ECMascript 5 unterscheidet sich vom strengen Modus von Firefox)
So aktivieren Sie den strengen Modus
Fügen Sie diese Aussage zu Beginn des Programms hinzu, um den strengen Modus für das gesamte Skript zu aktivieren:
Die Codekopie lautet wie folgt:
"Strikte";
Sie können auch den strengen Modus nur innerhalb der Funktion aktivieren, damit sich dies nicht auf die Außenseite auswirkt:
Die Codekopie lautet wie folgt:
Funktion imstrict () {
"Strikte";
// ... dein Code ...
}
Eine Anweisung, die den strengen Modus ermöglicht, ist nur eine normale Zeichenfolge "Strict" ohne neue Syntax. Dies bedeutet, dass der alte Browser keinen negativen Einfluss auf den alten Browser hat.
Eine praktische Anwendung der Aktivierung des strengen Modus in einer Funktion besteht darin, die gesamte Bibliothek der JavaScript -Klasse in einer strengen Modusfunktion zu definieren, damit sie keinen externen Code beeinflusst:
Die Codekopie lautet wie folgt:
// Nicht-Strenge-Code ...
(Funktion(){
"Strikt verwenden";
// Definieren Sie Ihre Bibliothek streng ...
}) ();
// Nicht-Strenge-Code ...
Welche Änderungen wurden in Skripten im strengen Modus vorgenommen?
Variablen und Eigenschaften
Das Zuweisen einer undefinierten Variablen ist fehl, anstatt diese Variable als globale Variable zu verwenden.
Das Schreiben einer Eigenschaft mit einer beschreibbaren Eigenschaft Falsch, das Löschen einer Eigenschaft mit einer konfigurierbaren Eigenschaft mit einem falschen oder Hinzufügen einer Eigenschaft mit einer erweiterbaren Eigenschaft mit einem falschen, führt zu einem Fehler (diese Eigenschaften sind vorab). In der Vergangenheit haben diese Operationen keine Ausnahmen geworfen, sondern lediglich lautlos gescheitert.
Durch die Durchführung von Löschvorgängen in Variablen, Funktionen oder Funktionsparametern führt zu einem Fehler.
Die Codekopie lautet wie folgt:
var foo = 'test';
Funktionstest () {}
Foo löschen; // Fehler
Test löschen; // Fehler
Funktion test2 (arg) {
arg löschen; // Fehler
}
Wenn Sie dieselbe Eigenschaft in einem Objektbehälter definieren, wird die Ausnahme ausgelöst:
Die Codekopie lautet wie folgt:
// Fehler
{foo: true, foo: false}
bewerten
Jede Verwendung des Namens "Eval" (der Hauptzweck besteht darin, die EV -Funktion auf eine Variable oder eine Objekteigenschaft zu verweisen) verboten.
Die Codekopie lautet wie folgt:
// alle erzeugen Fehler ...
obj.eval = ...
obj.foo = eval;
var eval = ...;
für (var eval in ...) {}
Funktion eval () {}
Funktionstest (eval) {}
Funktion (eval) {}
Neue Funktion ("eval")
Außerdem ist es ungültig, dass die Erklärung neuer Variablen über EVALE:
Die Codekopie lautet wie folgt:
eval ("var a = false;");
print (typeof a); // undefiniert
Funktion
Das Umschreiben von Argumenten kann einen Fehler verursachen:
Die Codekopie lautet wie folgt:
Argumente = [...]; // nicht erlaubt
Parameter mit demselben Namen verursachen einen Fehler:
Die Codekopie lautet wie folgt:
(Funktion (foo, foo) {}) // Fehler
Zugriff auf Argumente.Caller und Argumente.Callee macht eine Ausnahme. Daher muss jede anonyme Funktion, die verwendet werden muss, zuerst benannt werden, zum Beispiel:
Die Codekopie lautet wie folgt:
setTimeout (Funktion später () {
// Sachen machen ...
setTimeout (später 1000);
}, 1000);
Die Argumente, Anrufer- und Callee -Eigenschaften der Funktion existieren nicht mehr, und die Operation, um sie zu definieren, ist ebenfalls verboten.
Die Codekopie lautet wie folgt:
Funktionstest () {}
test.caller = 'Anrufer'; // Fehler
Schließlich wurde ein langjähriger (und sehr ärgerlicher) Fehler gelöst: Wenn null oder nicht definiert als erster Parameter der Funktion verwendet wird. Und strenger Modus verhindern seine Ausführung und werfen Ausnahmen aus:
Die Codekopie lautet wie folgt:
(function () {...}). call (null); // Ausnahme
mit() { }
Die mit () {} Anweisung hängt vollständig im strengen Modus.