Unterschiede: 1. Die Verwendung der with-Anweisung ist verboten. 2. Das Schlüsselwort this darf nicht auf das globale Objekt verweisen. 3. Es ist verboten, den Aufrufstapel innerhalb der Funktion zu durchlaufen. 4. Objekte dürfen keine Attribute mit haben 5. Die Zuweisung von Argumenten ist nicht zulässig. 7. Funktionen dürfen nicht in Nicht-Funktionscodeblöcken deklariert werden.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.
Der strikte Modus hat einige Änderungen an der Syntax und dem Verhalten von Javascript vorgenommen.
1 Explizite Deklaration globaler Variablen
Wenn einer Variablen im Normalmodus ein Wert zugewiesen wird, ohne deklariert zu werden, wird sie standardmäßig auf eine globale Variable gesetzt. Der strikte Modus verbietet diese Verwendung und globale Variablen müssen explizit deklariert werden.
"use strict"; v = 1; // 报错,v未声明 for(i = 0; i < 2; i++) { // 报错,i未声明 }
Daher müssen Variablen im strikten Modus vor der Verwendung mit dem Befehl var deklariert werden.
2 Statische Bindung
Ein Merkmal der Javascript-Sprache ist, dass sie eine „dynamische Bindung“ ermöglicht, d. h., zu welchem Objekt bestimmte Eigenschaften und Methoden gehören, wird nicht zur Kompilierzeit, sondern zur Laufzeit (Laufzeit) bestimmt. bestimmt.
Der strenge Modus erlegt der dynamischen Bindung einige Einschränkungen auf. In einigen Fällen ist nur statische Bindung zulässig. Mit anderen Worten: Zu welchem Objekt die Eigenschaften und Methoden gehören, wird während der Kompilierungsphase bestimmt. Dies trägt dazu bei, die Kompilierungseffizienz zu verbessern, den Code leichter lesbar zu machen und weniger Überraschungen zu verursachen.
Konkret geht es dabei um die folgenden Aspekte.
(1) Die Verwendung der with-Anweisung
ist verboten, da die with-Anweisung zur Kompilierungszeit nicht bestimmen kann, zu welchem Objekt das Attribut gehört.
"use strict"; var v = 1; with (o){ // 语法错误 v = 2; }
(2) Auswertungsbereich erstellen
Im normalen Modus verfügt die Javascript-Sprache über zwei Variablenbereiche: den globalen Bereich und den Funktionsbereich. Der strikte Modus erstellt einen dritten Bereich: den Auswertungsbereich.
Im normalen Modus hängt der Umfang der Eval-Anweisung davon ab, ob sie sich im globalen Bereich oder im Funktionsbereich befindet. Im strikten Modus ist die eval-Anweisung selbst ein Bereich und kann keine globalen Variablen mehr generieren. Die von ihr generierten Variablen können nur innerhalb von eval verwendet werden.
"use strict"; var x = 2; console.info(eval("var x = 5; x")); // 5 console.info(x); // 2
3 Erweiterte Sicherheitsmaßnahmen
(1) Verhindern, dass dieses Schlüsselwort auf das globale Objekt verweist
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
Wenn Sie also bei Verwendung des Konstruktors vergessen, new hinzuzufügen, zeigt dies nicht mehr darauf das globale Objekt, aber es ist ein Fehler.
function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义
(2) Es ist verboten, den Aufrufstapel innerhalb der Funktion zu durchlaufen
function f1(){ "use strict"; f1.caller; // 报错 f1.arguments; // 报错 } f1();
4 Es ist verboten, Variablen zu löschen
Variablen können im strikten Modus nicht gelöscht werden. Es können nur Objekteigenschaften gelöscht werden, deren konfigurierbare Eigenschaft auf „true“ gesetzt ist.
"use strict"; var x; delete x; // 语法错误 var o = Object.create(null, {'x': { value: 1, configurable: true }}); delete o.x; // 删除成功
5 Explizite Fehlerberichterstattung
Im normalen Modus wird beim Zuweisen eines Werts zu einer schreibgeschützten Eigenschaft eines Objekts kein Fehler gemeldet, sondern es schlägt stillschweigend fehl. Im strikten Modus wird ein Fehler gemeldet.
"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 报错
Im strikten Modus wird ein Fehler gemeldet, wenn einer mit der Getter-Methode gelesenen Eigenschaft ein Wert zugewiesen wird.
"use strict"; var o = { get v() { return 1; } }; o.v = 2; // 报错
Im strikten Modus führt das Hinzufügen neuer Attribute zu Objekten, deren Erweiterung verboten ist, zu einem Fehler.
"use strict"; var o = {}; Object.preventExtensions(o); o.v = 1; // 报错
Wenn Sie im strikten Modus ein Attribut löschen, das nicht gelöscht werden kann, wird ein Fehler gemeldet.
"use strict"; delete Object.prototype; // 报错
6 Fehler bei doppeltem Namen
Der strikte Modus hat einige neue Syntaxfehler hinzugefügt.
(1) Objekte können keine Attribute mit doppelten Namen haben
Wenn ein Objekt im normalen Modus mehrere Attribute mit doppelten Namen hat, überschreibt das zuletzt zugewiesene Attribut den vorherigen Wert. Im strikten Modus handelt es sich um einen Syntaxfehler.
"use strict"; var o = { p: 1, p: 2 }; // 语法错误
(2) Die Funktion darf keine Parameter mit demselben Namen haben
Wenn die Funktion im normalen Modus mehrere Parameter mit demselben Namen hat, können Sie diese mit arguments[i] lesen. Im strikten Modus handelt es sich um einen Syntaxfehler.
"use strict"; function f(a, a, b) { // 语法错误 return ; }
7 Verbotene Oktaldarstellung
Wenn im Normalmodus die erste Ziffer einer Ganzzahl 0 ist, bedeutet dies, dass es sich um eine Oktalzahl handelt. Beispielsweise entspricht 0100 der Dezimalzahl 64. Der strikte Modus verbietet diese Darstellung, das erste Bit der Ganzzahl ist 0 und es wird ein Fehler gemeldet.
"use strict"; var n = 0100; // 语法错误
8 Einschränkungen des Argumentobjekts
arguments ist das Parameterobjekt der Funktion, und der strikte Modus schränkt seine Verwendung ein.
(1) Die Zuweisung zu Argumenten ist nicht zulässig anonym sein Die Funktion ruft sich intern auf.
"use strict"; arguments++; // 语法错误 var obj = { set p(arguments) { } }; // 语法错误 try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
9 Funktionen müssen auf der obersten Ebene deklariert werden
In Zukunft werden neue Versionen von Javascript einen „Block-Level-Bereich“ einführen. Um mit der neuen Version Schritt zu halten, erlaubt der strikte Modus nur die Deklaration von Funktionen im globalen Bereich oder auf der obersten Ebene des Funktionsbereichs. Das heißt, es ist nicht erlaubt, Funktionen innerhalb eines Nicht-Funktionscodeblocks zu deklarieren.
"use strict"; if (true) { function f() { } // 语法错误 } for (var i = 0; i < 5; i++) { function f2() { } // 语法错误 }
【相关推荐:javascript学习教程】
Das obige ist der detaillierte Inhalt vonWas sind die Unterschiede zwischen dem strikten Javascript-Modus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!