Was sind die Unterschiede zwischen dem strikten Javascript-Modus?

青灯夜游
Freigeben: 2022-02-18 18:19:36
Original
2096 Leute haben es durchsucht

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.

Was sind die Unterschiede zwischen dem strikten Javascript-Modus?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.

Unterschiede im strikten JavaScript-Modus

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未声明
  }
Nach dem Login kopieren

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;
  }
Nach dem Login kopieren

(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
Nach dem Login kopieren

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。
Nach dem Login kopieren

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未定义
Nach dem Login kopieren

(2) Es ist verboten, den Aufrufstapel innerhalb der Funktion zu durchlaufen

  function f1(){
    "use strict";
    f1.caller;    // 报错
    f1.arguments; // 报错
  }
  f1();
Nach dem Login kopieren

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, {&#39;x&#39;: {
      value: 1,
      configurable: true
  }});
  delete o.x; // 删除成功
Nach dem Login kopieren

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; // 报错
Nach dem Login kopieren

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; // 报错
Nach dem Login kopieren

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; // 报错
Nach dem Login kopieren

Wenn Sie im strikten Modus ein Attribut löschen, das nicht gelöscht werden kann, wird ein Fehler gemeldet.

  "use strict";
  delete Object.prototype; // 报错
Nach dem Login kopieren

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
  }; // 语法错误
Nach dem Login kopieren

(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 ;
  }
Nach dem Login kopieren

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; // 语法错误
Nach dem Login kopieren

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", "&#39;use strict&#39;; return 17;");  // 语法错误
Nach dem Login kopieren

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() { } // 语法错误
  }
Nach dem Login kopieren

【相关推荐: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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage