Heim  >  Artikel  >  Web-Frontend  >  Vertiefende Kenntnisse des strengen Javascript-Modus (Strict Mode)_Javascript-Fähigkeiten

Vertiefende Kenntnisse des strengen Javascript-Modus (Strict Mode)_Javascript-Fähigkeiten

WBOY
WBOYOriginal
2016-05-16 16:29:521551Durchsuche

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.

Code kopieren Der Code lautet wie folgt:

// Der folgende JavaScript-Code löst im strikten Modus einen Fehler aus
mit (Standort) {
alarm(href);
}

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.

Code kopieren Der Code lautet wie folgt:

// Eine Ausnahme wird im strikten Modus
ausgelöst (function() {
SomeUndeclaredVar = "foo";
}());

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:

Code kopieren Der Code lautet wie folgt:

window.color = "red";
Funktion sayColor() {
alarm(this.color);
}
// Im strikten Modus wird ein Fehler gemeldet. Wenn nicht im strikten Modus, wird „rot“
angezeigt. sayColor();
// Im strikten Modus wird ein Fehler gemeldet. Wenn nicht im strikten Modus, wird „rot“
angezeigt. sayColor.call(null);

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.

Code kopieren Der Code lautet wie folgt:

Funktion Person(name) {
This.name = name;
}
//Im strikten Modus
wird ein Fehler gemeldet var me = Person("Nicholas");

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

Code kopieren Der Code lautet wie folgt:

//Doppelte Variablennamen melden einen Fehler im strikten Modus
Funktion doSomething(value1, value2, value1) {
//code
}
//Doppelte Objektattributnamen melden einen Fehler im strikten Modus:
var object = {
foo: „bar“,
foo: „baz“
};

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:

Code kopieren Der Code lautet wie folgt:

(function() {
eval("var x = 10;");
// Im nicht strengen Modus Alarm 10
// Im strikten Modus wird eine Ausnahme ausgelöst, weil x nicht definiert ist,
alarm(x);
}());

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:

Code kopieren Der Code lautet wie folgt:

(function() {
var result = eval("var x = 10, y = 20; x y");
//Die restlichen Anweisungen können im strikten oder nicht strikten Modus korrekt ausgeführt werden (Ergebnis ist 30)
Warnung(Ergebnis);
}());

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.

Code kopieren Der Code lautet wie folgt:

var person = {};
Object.defineProperty(person, „name“ {
beschreibbar: falsch,
Wert: „Nikolaus“
});
// Im nicht-strikten Modus tritt ein stiller Fehler auf, im strikten Modus wird eine Ausnahme ausgelöst
person.name = "John";

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.

Code kopieren Der Code lautet wie folgt:

// Bitte verwenden Sie es nicht so
„strikt verwenden“;
Funktion doSomething() {
// Dieser Teil des Codes wird im strikten Modus ausgeführt
}
Funktion doSomethingElse() {
// Dieser Teil des Codes wird auch im strikten Modus ausgeführt
}


Obwohl der obige Code kein großes Problem zu sein scheint. Wenn Sie jedoch nicht für die Pflege des gesamten auf der Seite eingeführten Codes verantwortlich sind, werden Sie durch die Verwendung des strikten Modus auf diese Weise Problemen ausgesetzt, die durch Code von Drittanbietern verursacht werden, der nicht für den strikten Modus vorbereitet ist.

Daher ist es am besten, die Anweisung zum Aktivieren des strikten Modus in der Funktion anzuwenden, zum Beispiel:

Code kopieren Der Code lautet wie folgt:

Funktion doSomething() {
„strikt verwenden“;
//Der Code in dieser Funktion wird im strikten Modus ausgeführt
}
Funktion doSomethingElse() {
//Der Code in dieser Funktion wird nicht im strikten Modus ausgeführt
}


Wenn Sie möchten, dass der strikte Modus in mehr als einer Funktion aktiviert wird, verwenden Sie einen sofort aufgerufenen Funktionsausdruck (IIFE):

Code kopieren Der Code lautet wie folgt:

(function() {
„strikt verwenden“;
Funktion doSomething() {
               // Diese Funktion wird im strikten Modus ausgeführt
}
Funktion doSomethingElse() {
               // Diese Funktion läuft auch im strikten Modus
}
}());

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn