Der in ECMAScript5 eingeführte strikte Modus ermöglicht Entwicklern eine „bessere“ JavaScript-Sprache, indem er es der JavaScript-Laufzeitumgebung ermöglicht, einige der häufigsten und am schwersten zu findenden Fehler im Entwicklungsprozess anders als derzeit zu behandeln. Ich war lange Zeit skeptisch gegenüber dem Strict Mode, da ihn nur Firefox unterstützte. Aber heute unterstützen alle großen Browser in ihren neuesten Versionen den strikten Modus (einschließlich IE10, Opera12 und Android4, IOS5).
Welche Rolle spielt der strikte Modus?
Der strenge Modus führt viele Änderungen an JavaScript ein, und ich unterteile sie in zwei Kategorien (offensichtlich und subtil). Das Ziel kleinerer Verbesserungen besteht darin, einige detaillierte Probleme im aktuellen JavaScript zu beheben, auf die ich hier nicht näher eingehen werde. Wenn Sie interessiert sind, lesen Sie bitte das ausgezeichnete Dokument ECMA-262-5 im Detail, Kapitel 2, Strikter Modus von Dmitry Soshnikov . Ich werde mich hier auf die offensichtlichen Änderungen konzentrieren, die der strikte Modus mit sich bringt, auf die Konzepte, die Sie kennen sollten, bevor Sie den strikten Modus verwenden, und auf die Änderungen, die Ihnen am meisten helfen.
Bevor Sie mit dem Erlernen bestimmter Funktionen beginnen, denken Sie bitte daran, dass eines der Ziele des strikten Modus darin besteht, Ihnen ein schnelleres und bequemeres Debuggen zu ermöglichen. Für die Laufzeitumgebung ist es besser, explizit einen Fehler auszulösen, wenn sie ein Problem erkennt, als stillschweigend auszufallen oder sich seltsam zu verhalten (wie es häufig bei JavaScript-Laufzeiten der Fall ist, die den strikten Modus nicht aktivieren). Der strikte Modus wirft mehr Fehler aus, aber das ist gut so, denn diese Fehler erregen Ihre Aufmerksamkeit und beheben viele potenzielle Probleme, die zuvor schwer zu finden waren.
WIT-Schlüsselwort entfernen
Zuerst wird die with-Anweisung aus dem strikten Modus entfernt. Code, der die with-Anweisung enthält, löst eine Ausnahme im strikten Modus aus. Der erste Schritt zur Verwendung des strikten Modus: Stellen Sie sicher, dass Sie „with“ in Ihrem Code nicht verwenden.
Versehentliche Zuweisung globaler Variablen verhindern
Zweitens müssen lokale Variablen deklariert werden, bevor ein Wert zugewiesen wird. Bevor der strikte Modus aktiviert wird, wird durch das Kopieren einer nicht deklarierten lokalen Variablen automatisch eine globale Variable mit demselben Namen erstellt. Dies ist einer der häufigsten Fehler in JavaScript-Programmen und es wird eine explizite Ausnahme ausgelöst, wenn Sie versuchen, dies im strikten Modus zu tun.
THIS in der Funktion zeigt standardmäßig nicht mehr auf das Globale
Eine weitere wichtige Änderung im strikten Modus besteht darin, dass diese in einer Funktion, die undefiniert oder leer (null oder undefiniert) ist, nicht mehr standardmäßig auf die globale Umgebung (global) verweist. Dies führt zu Fehlern bei der Ausführung einiger Codes, die auf dem Standardverhalten in Funktionen basieren, wie zum Beispiel:
Dies bleibt undefiniert, bis es zugewiesen wird. Dies bedeutet, dass bei der Ausführung eines Konstruktors eine Ausnahme ausgelöst wird, wenn zuvor kein klares neues Schlüsselwort vorhanden ist.
Wenn im obigen Code der Person-Konstruktor ausgeführt wird, bleibt dies in der Funktion undefiniert, da Sie keine Eigenschaften für undefiniert festlegen können, und der obige Code löst einen Fehler aus. In einer Umgebung mit nicht striktem Modus verweist dieser nicht kopierte Wert standardmäßig auf die globale Fenstervariable, und das Ergebnis des Vorgangs ist, dass versehentlich das Namensattribut für die globale Fenstervariable festgelegt wird.
Duplikate Namen verhindern
Wenn Sie viel Code schreiben, kann es leicht passieren, dass Objekteigenschaften und Funktionsparameter versehentlich auf einen doppelten Namen festgelegt werden. Der strikte Modus löst in diesem Fall explizit einen Fehler aus
Der obige Code wird im strikten Modus als Syntaxfehler betrachtet und Sie werden vor der Ausführung dazu aufgefordert.
Sicheres EVAL()
Obwohl die eval()-Anweisung letztendlich nicht entfernt wurde, wurden im strikten Modus dennoch einige Verbesserungen daran vorgenommen. Die größte Änderung besteht darin, dass in eval() ausgeführte Variablen- und Funktionsdeklarationen nicht direkt entsprechende Variablen oder Funktionen im aktuellen Bereich erstellen, zum Beispiel:
Alle Variablen oder Funktionen, die während der Ausführung von eval() erstellt wurden, bleiben in eval() erhalten. Aber Sie können das Ausführungsergebnis in eval() eindeutig aus dem Rückgabewert der eval()-Anweisung erhalten, zum Beispiel:
Ausnahme beim Ändern schreibgeschützter Eigenschaften
ECMAScript5 bietet außerdem die Möglichkeit, bestimmte Eigenschaften eines Objekts als schreibgeschützt festzulegen oder das gesamte Objekt nicht änderbar zu machen. Im nicht strikten Modus schlägt der Versuch, eine schreibgeschützte Eigenschaft zu ändern, jedoch stillschweigend fehl. Sie werden wahrscheinlich auf diese Situation stoßen, wenn Sie mit einigen browsernativen APIs arbeiten. Der strikte Modus löst in diesem Fall explizit eine Ausnahme aus, um Sie daran zu erinnern, dass das Ändern dieser Eigenschaft nicht zulässig ist.
Im obigen Beispiel ist das Namensattribut auf schreibgeschützt gesetzt. Das Ändern des Namensattributs im nicht strikten Modus führt nicht zu einem Fehler, die Änderung ist jedoch nicht erfolgreich. Der strikte Modus löst jedoch explizit eine Ausnahme aus.
HINWEIS: Es wird dringend empfohlen, den strikten Modus zu aktivieren, wenn Sie eine ECMAScript-Eigenschaftsattributspezifikation verwenden.
Wie benutzt man?
Es ist sehr einfach, den strikten Modus in modernen Browsern zu aktivieren. Geben Sie einfach den folgenden Befehl in den JavaScript-Code ein
"strikt verwenden";
Obwohl es den Anschein hat, dass es sich bei dem obigen Code nur um eine Zeichenfolge handelt, die keiner Variablen zugewiesen ist, weist er die JavaScript-Engine tatsächlich an, in den strikten Modus zu wechseln (Browser, die den strikten Modus nicht unterstützen, ignorieren den obigen Code und führen ihn nicht aus Auswirkungen auf die spätere Ausführung). Obwohl Sie diese Direktive global oder in einer bestimmten Funktion anwenden können, müssen Sie dennoch daran erinnert werden, den strikten Modus in der globalen Umgebung nicht zu aktivieren.
Daher ist es am besten, die Anweisung zum Aktivieren des strikten Modus in der Funktion anzuwenden, zum Beispiel:
Fazit
Ich empfehle dringend, dass Sie ab sofort den strikten JavaScript-Modus aktivieren, er kann Ihnen helfen, unbemerkte Fehler in Ihrem Code zu finden. Aktivieren Sie es nicht global, aber Sie können IIFE (sofortige Ausführung von Funktionsausdrücken) so weit wie möglich verwenden, um den strikten Modus auf mehrere Funktionsbereiche anzuwenden. Am Anfang werden Sie auf Fehlermeldungen stoßen, die Ihnen noch nie begegnet sind. Das ist normal. Wenn Sie den strikten Modus aktivieren, testen Sie ihn unbedingt in unterstützten Browsern, um neue potenzielle Probleme zu identifizieren. Fügen Sie Ihrem Code nicht einfach eine „use strict“-Zeile hinzu und gehen Sie davon aus, dass der Rest des Codes funktioniert. Beginnen Sie abschließend bitte damit, besseren Code im strikten Modus zu schreiben.
Hinweis:
Hier finden Sie eine Zusammenfassung der Unterstützung des strikten Modus in verschiedenen Browsern.
Auf dieser Seite können Sie die Strict-Mode-Unterstützung des aktuellen Browsers testen.
Vorteile des strikten Modus:
JavaScript stärker machen
1. Dies ist nicht mehr gekapselt. Im Normalmodus ist dies immer ein Objekt.
2. Fun.caller und fun.arguments sind keine Attribute, die gelöscht, noch festgelegt oder abgerufen werden können.
3. Arguments.caller ist ebenfalls ein Attribut, das weder gelöscht noch festgelegt oder abgerufen werden kann.
Bereitet den Weg für zukünftige ECMAScript-Versionen
1. Die folgenden reservierten Wörter wurden hinzugefügt: implementiert, Schnittstelle, let, Paket, private, geschützt, öffentlich, statisch und Ertrag.
2. Die Methodendeklaration sollte am Anfang des Skripts oder der Methode stehen und darf nicht in der Mitte von Anweisungen wie if oder for platziert werden.