"Strict Mode" ist eine neue Syntax, die in ECMA-262 Edition 5 definiert ist, die angibt, dass sie mit strengen JavaScript-Syntax ausgeführt werden muss. Einige verwendeten Schreibmethoden in der Vergangenheit werden SyntaxEerror -Ausnahmen auswirken, wie z. B.:
1. Keine VAR -Deklaration vor der Variablen
2. Verwenden Sie die Oktal -Syntax: var n = 023 und var s = "/047"
3. Verwendung mit Aussagen
4.. Verwenden Sie löschen, um einen Variablennamen zu löschen (nicht der Attributname): MyVariable löschen
5. Verwenden Sie Eval oder Argumente als variabler Name oder Funktionsname
6. Verwenden Sie zukünftige reservierte Wörter (möglicherweise in ECMascript 6 verwendet): Geräten, Schnittstellen, Let, Paket, privat, geschützt, öffentlich, statisch und ergeben als variable Namen oder Funktionsnamen
7. Verwenden Sie die Funktionserklärung in Anweisung Block: if (a <b) {Funktion f () {}}
8. Andere Fehler
8.1. Verwenden Sie zwei identische Attributnamen in der Sub-Face-Größe der Objekte: {A: 1, B: 3, A: 7}
8.2. Verwenden Sie zwei identische Parameternamen in den Funktionsparametern: Funktion F (a, b, b) {}
Diese werden nachstehend ausführlich erklärt.
1. Warum "strengen Modus" verwenden.
Der Zweck der Festlegung eines "strengen Modells" ist hauptsächlich wie folgt:
1. Beseitigen Sie einige unangemessene und unvollständige Aspekte der JavaScript -Syntax und reduzieren Sie einige seltsame Verhaltensweisen.
2. Eliminieren Sie einige Unsicherheiten im Code, das ausgeführt wird, und stellen Sie sicher, dass die Sicherheit des so ausgeführten Codes sichergestellt wird.
3. Effizienz verbessern und die Betriebsgeschwindigkeit erhöhen;
4. Legen Sie in Zukunft die Grundlage für die neue Version von JavaScript.
"Strict Mode" spiegelt die vernünftigere, sicherere und strengere Entwicklungsrichtung von JavaScript wider. Mainstream -Browser, einschließlich IE 10, haben es bereits unterstützt, und viele Großprojekte haben begonnen, es vollständig anzunehmen.
Andererseits kann der gleiche Code unterschiedliche laufende Ergebnisse im "strengen Modus" haben. Einige Aussagen, die im "normalen Modus" ausgeführt werden können, werden im "Strict -Modus" nicht ausgeführt. Wenn Sie diese Inhalte beherrschen, können Sie JavaScript sorgfältiger und ausführlicher verstehen und Sie zu einem besseren Programmierer machen.
Dieser Artikel enthält eine detaillierte Einführung in das "strenge Modell".
2. Deklarieren Sie den "strengen Modus"
Die Erklärung des "strengen Modus" ist einfach und hat nur eine Aussage:
Die Codekopie lautet wie folgt: "Strikt verwenden";
Hinweis: Ältere Browser behandeln es als normale Zeichenfolge und ignorieren sie.
3. Deklarieren Sie den Standort und die kontextbezogene Beziehung des "strengen Modus"
"Strict -Modus" wirkt sich hauptsächlich auf den Umfang aus, in dem es sich befindet. Wenn es in Funktionen verwendet wird, verwandelt es nicht den globalen Umfang und andere nicht verwendete Funktionen in "strengen Modus". Das heißt, der Umfang einer strengen Mustererklärung hängt von seinem Kontext ab. Wenn der strenge Modus in einem globalen Kontext (außerhalb des Umfangs einer Funktion) deklariert wird, befindet sich der gesamte Code im Programm im strengen Modus. Wenn in einer Funktion ein striktes Muster deklariert wird, befindet sich der gesamte Code in der Funktion streng. Im folgenden Beispiel befindet sich im folgenden Beispiel im strengen Modus, und variable Deklarationen außerhalb der Funktion verursachen einen Syntaxfehler: "Variablen werden im strengen Modus nicht definiert". Es gibt zwei Möglichkeiten, "strengen Modus" zu nennen, und sind für verschiedene Anlässe geeignet.
1.Für die gesamte Skriptdatei
Stellen Sie "Strict" in die erste Zeile der Skriptdatei ein und das gesamte Skript wird im "Strict -Modus" ausgeführt. Wenn sich diese Zeilenanweisung nicht in der ersten Zeile befindet, ist sie ungültig und das gesamte Skript wird im "normalen Modus" ausgeführt. Dies erfordert besondere Aufmerksamkeit, wenn Codedateien verschiedener Modi in eine Datei zusammengeführt werden.
(Streng genommen ist die Aussage, die das tatsächliche laufende Ergebnis nicht erzeugt, möglicherweise nicht in der ersten Zeile, z. B. direkt einem leeren Semikolon.)
Die Codekopie lautet wie folgt:
<Script>
"Strikt verwenden";
console.log ("Dies ist strenger Modus.");
</script>
<Script>
console.log ("Dies ist normaler Modus.");
</script>
Der obige Code zeigt an, dass auf einer Webseite zwei Teile des JavaScript -Codes auf dem Laufenden sind. Das vorherige Skript -Tag ist der strenge Modus, letzteres nicht.
2. Für eine einzelne Funktion
Setzen Sie "Strikte" in die erste Zeile des Funktionskörpers ein, und die gesamte Funktion läuft im "strengen Modus".
Die Codekopie lautet wie folgt:
Funktion strict () {
"Strikt verwenden";
zurück "Dies ist ein strenger Muster.";
}
Funktion Notstrict () {
zurück "Dies ist normaler Modus.";
}
3.. Problemumgehungen für Skriptdateien
Da die erste Anrufmethode nicht für das Zusammenführen von Dateien förderlich ist, ist es besser, die zweite Methode auszuleihen und die gesamte Skriptdatei in eine anonyme Funktion zu platzieren, die sofort ausgeführt wird.
Die Codekopie lautet wie folgt:
(function () {
"Strikt verwenden";
// hier ein Code hier
}) ();
4. Syntax- und Verhaltensänderungen unter "Strict -Modus"
"Strict Mode" hat einige Änderungen an der Syntax und dem Verhalten von JavaScript vorgenommen.
1. Explizite Erklärung globaler Variablen
Im normalen Modus müssen wir bei der Verwendung von Variablen VAR nicht verwenden, um zu deklarieren (explizit deklarieren), aber im strengen Modus müssen wir var verwenden, um vor der Verwendung von Variablen zu deklarieren, andernfalls tritt ein Fehler auf.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
v = 1; // Ein Fehler wird gemeldet, V wird nicht deklariert
für (i = 0; i <2; i ++) {// Es wurde ein Fehler gemeldet, ich wurde nicht deklariert
}
Daher müssen im strengen Modus Variablen vor der Verwendung mit dem Befehl var deklariert werden.
2. statische Bindung
Ein Merkmal der JavaScript -Sprache ist, dass es zulässt, dass "dynamische Bindung", dh, welches Objekt bestimmte Eigenschaften und Methoden gehören, nicht zur Kompilierungszeit, sondern zur Laufzeit bestimmt wird.
Der strenge Modus legt einige Einschränkungen für die dynamische Bindung vor. In einigen Fällen ist nur statische Bindung zulässig. Mit anderen Worten, welchen Objekt die Attribute und Methoden angehören, werden während der Kompilierungsphase bestimmt. Dies wird dazu beitragen, die Kompilierungseffizienz zu verbessern, den Code leichter zu lesen und weniger Unfälle.
Insbesondere sind die folgenden Aspekte beteiligt.
(1) Die Verwendung mit Aussagen ist verboten
Da die mit der Anweisung nicht zum Kompilierungszeit ermittelt werden kann, welches Objekt das Attribut gehört.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var v = 1;
mit (o) {// Syntaxfehler
v = 2;
}
(2) Erstellen Sie einen Evalumfang
Im normalen Modus hat die JavaScript -Sprache zwei variable Bereiche: globaler Umfang und Funktionsbereich. Der strikte Modus erzeugt einen dritten Umfang: Eval -Bereich.
Im normalen Modus hängt der Umfang der Bewertungserklärung davon ab, ob sie sich im globalen Bereich oder im Funktionsbereich befindet. Im strengen Modus ist die Bewertungsaussage selbst ein Umfang und kann keine globalen Variablen mehr erzeugen. Die Variablen, die es erzeugt, können nur in Eval verwendet werden.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var x = 2;
console.info (eval ("var x = 5; x")); // 5
console.info (x); // 2
3.. Verbesserte Sicherheitsmaßnahmen
(1) verbieten dieses Schlüsselwort, auf globale Objekte zu verweisen
Die Codekopie lautet wie folgt:
Funktion f () {
Rückkehr! Dies;
}
// false zurückgeben, weil "dies" auf das globale Objekt zeigt "! Dies" ist falsch
Funktion f () {
"Strikt verwenden";
Rückkehr! Dies;
}
// true zurückgeben, denn im strengen Modus ist der Wert davon undefiniert, also "das" ist wahr.
Wenn Sie den Konstruktor verwenden, weist Sie daher nicht mehr auf das globale Objekt hin, sondern meldet dies einen Fehler mehr.
Die Codekopie lautet wie folgt:
Funktion f () {
"Strikt verwenden";
this.a = 1;
};
f (); // Fehler, dies ist nicht definiert
In der normalen Funktion rufen Sie F () auf, der Wert dieser Hinweise auf das globale Objekt. Im strengen Modus zeigt der Wert davon auf undefinierte. Wenn die Funktion durch den Anruf aufgerufen und angewendet wird, wenn der übergebene Parameter dieser Wert ein primitiver Wert (String, Zahl, Boolesche Wert) ist, mit Ausnahme von Null und Undefined, wird der Wert davon zum Wrapper -Objekt, der dem ursprünglichen Wert entspricht. Wenn der Wert dieses Wertparameters undefiniert oder NULL ist, weist der Wert dieses Problems auf das globale Objekt hin. Im strengen Modus ist der Wert dieses Wertes der Wert dieses Wertparameters ohne Umwandlung von Typ.
(2) verboten, den Anrufstapel innerhalb der Funktion zu durchqueren
Die Codekopie lautet wie folgt:
Funktion f1 () {
"Strikt verwenden";
f1.caller; // einen Fehler melden
F1.Argumente; // einen Fehler melden
}
F1 ();
4. Deaktivieren Sie die Löschung von Variablen
Variablen können nicht im strengen Modus gelöscht werden. Nur die Objekteigenschaften, deren Konfigurierbar auf True gesetzt ist, können gelöscht werden.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var x;
x löschen; // Syntaxfehler
var o = Object.create (null, 'x', {
Wert: 1,
Konfigurierbar: True
});
Ochsen löschen; // erfolgreich löschen
5. Explizite Fehler
Wenn Sie im normalen Modus eine schreibgeschützte Eigenschaft eines Objekts zuweisen, gibt es keine Fehler, und es wird nur lautlos ausfallen. Im strengen Modus wird ein Fehler gemeldet.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var o = {};
Object.DefineProperty (o, "v", {value: 1, beschreibbar: false});
ov = 2; // einen Fehler melden
Wenn Sie im strengen Modus eine Eigenschaft mit der Getter -Methode zuweisen, wird ein Fehler gemeldet.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var o = {
GET v () {return 1; }
};
ov = 2; // einen Fehler melden
Im strengen Modus führt das Hinzufügen neuer Attribute zu Objekten, die verboten sind, erweitert zu werden, zu einem Fehler.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var o = {};
Object.Preventextensions (o);
ov = 1; // einen Fehler melden
Im strengen Modus verursacht das Löschen einer unelektronischen Eigenschaft einen Fehler.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
Object.Prototype löschen; // einen Fehler melden
6. Fehler umbenennen
Der strenge Modus hat einige Syntaxfehler hinzugefügt.
(1) Objekte können keine Attribute mit doppelten Namen haben
Wenn das Objekt im normalen Modus mehrere doppelte Attribute hat, überschreibt das zuletzt zugewiesene Attribut den vorherigen Wert. Im strengen Modus ist dies ein Syntaxfehler.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var o = {
P: 1,
P: 2
}; // Syntaxfehler
(2) Funktionen können keine Parameter mit doppelten Namen haben
Wenn die Funktion im normalen Modus mehrere Parameter mit doppelten Namen enthält, kann sie mit Argumenten [i] gelesen werden. Im strengen Modus ist dies ein Syntaxfehler.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
Funktion f (a, a, b) {// Syntaxfehler
zurückkehren ;
}
7. Oktalnotation ist verboten
Wenn das erste Bit einer Ganzzahl 0 ist, bedeutet dies, dass dies eine Oktalzahl ist, wie z. B. 0100 entspricht 64 im Dezimal. Der strenge Modus verbietet diese Darstellung. Wenn das erste Bit der Ganzzahl 0 ist, wird ein Fehler gemeldet.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var n = 0100; // Syntaxfehler
8. Einschränkungen von Argumentenobjekten
Argumente sind Parameterobjekte von Funktionen, und der strenge Modus begrenzt seine Verwendung.
(1) Argumente zuzuweisen ist nicht zulässig
Die Codekopie lautet wie folgt:
"Strikt verwenden";
Argumente ++; // Syntaxfehler
var obj = {set P (Argumente) {}}; // Syntaxfehler
Versuchen Sie {} catch (Argumente) {} // Syntaxfehler
Funktionsargumente () {} // Syntaxfehler
var f = Neue Funktion ("Argumente", "" Verwenden Sie strikt "; Rückgabe 17;"); // Syntaxfehler
(2) Argumente verfolgen nicht mehr die Änderungen der Parameter
Die Codekopie lautet wie folgt:
Funktion f (a) {
a = 2;
Return [a, Argumente [0]];
}
f (1); // Normaler Modus ist [2,2]
Funktion f (a) {
"Strikt verwenden";
a = 2;
Return [a, Argumente [0]];
}
f (1); // Strikter Modus ist [2,1]
(3) Verwendung von Argumenten.Callee ist verboten
Dies bedeutet, dass Sie sich nicht in einer anonymen Funktion anrufen können.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
var f = function () {return argumente.callee; };
F(); // einen Fehler melden
9. Die Funktion muss auf der oberen Ebene deklariert werden
In Zukunft werden neue Versionen von JavaScript "Blockebene" einführen. Um sich an der neuen Version auszurichten, ermöglicht der strikte Modus nur Funktionen auf der obersten Ebene des globalen Umfangs oder des Funktionsbereichs. Das heißt, es darf keine Funktionen in nicht funktionsfähigen Codeblöcken deklarieren.
Die Codekopie lautet wie folgt:
"Strikt verwenden";
if (wahr) {
Funktion f () {} // Syntaxfehler
}
für (var i = 0; i <5; i ++) {
Funktion f2 () {} // Syntaxfehler
}
10. Wörter halten
Um in Zukunft zu einer neuen Version von JavaScript überzugehen, wurden dem strengen Modus einige reservierte Wörter hinzugefügt: Geräten, Schnittstelle, LET, Paket, privat, geschützt, öffentlich, statisch, Ertrag.
Die Verwendung dieser Wörter als Variablennamen führt zu einem Fehler.
Die Codekopie lautet wie folgt:
Funktionspaket (geschützt) {// Syntaxfehler
"Strikt verwenden";
var implementiert; // Syntaxfehler
}
Darüber hinaus sieht die fünfte Version von ECMascript auch andere reservierte Wörter vor (Klasse, Enum, Exportieren, Erweiterungen, Import, Super) sowie const reservierte Wörter, die von großen Browsern hinzugefügt werden, die nicht als Variablennamen verwendet werden können.