Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung des strikten Javascript-Modus

Detaillierte Erläuterung des strikten Javascript-Modus

jacklove
jackloveOriginal
2018-06-11 22:19:031377Durchsuche

1. Übersicht

Zusätzlich zum normalen Betriebsmodus fügt ECMAscript 5 einen zweiten Betriebsmodus hinzu: „Strenger Modus“. Wie der Name schon sagt, führt dieser Modus dazu, dass Javascript unter strengeren Bedingungen ausgeführt wird.

Die Hauptziele der Einrichtung des „strengen Modus“ sind folgende:

– Beseitigen Sie einige unangemessene und ungenaue Aspekte der Javascript-Syntax und reduzieren Sie einige seltsame Verhaltensweisen ;

 - Beseitigen Sie einige unsichere Aspekte der Codeausführung und gewährleisten Sie die Sicherheit der Codeausführung;

 - Verbessern Sie die Compiler-Effizienz und erhöhen Sie die Ausführungsgeschwindigkeit Versionen von Javascript in der Zukunft.

Der „Strikte Modus“ spiegelt die vernünftigere, sicherere und strengere Entwicklungsrichtung von Javascript wider, einschließlich IE 10, und viele große Projekte haben damit begonnen, ihn vollständig zu übernehmen.

Andererseits kann derselbe Code im „strikten Modus“ zu unterschiedlichen Ausführungsergebnissen führen. Einige Anweisungen, die im „normalen Modus“ ausgeführt werden können, können nicht im „strikten Modus“ ausgeführt werden. Wenn Sie diese Inhalte beherrschen, können Sie Javascript besser verstehen und ein besserer Programmierer werden.

In diesem Artikel wird der „strenge Modus“ ausführlich vorgestellt.

2. Eintrittszeichen

Das Zeichen für den Eintritt in den „strengen Modus“ ist die folgende Zeile:

 "use strict";

Ältere Versionen von Browsern behandeln es als eine Zeile gewöhnlicher Zeichenfolgen und ignorieren es.

3. So rufen Sie an

Der „Strenge Modus“ verfügt über zwei Aufrufmethoden, die für verschiedene Anlässe geeignet sind.

3.1 Für die gesamte Skriptdatei

geben Sie „use strict“ in die erste Zeile der Skriptdatei ein, dann wird das gesamte Skript im „strict mode“ ausgeführt. Wenn diese Anweisungszeile nicht die erste Zeile ist, hat sie keine Auswirkung und das gesamte Skript läuft im „Normalmodus“. Dies erfordert besondere Aufmerksamkeit, wenn Codedateien aus verschiedenen Modi in einer Datei zusammengeführt werden.

(Genau genommen muss „use strict“ nicht in der ersten Zeile stehen, z. B. direkt nach einem leeren Semikolon, solange es sich bei der vorhergehenden Anweisung nicht um eine Anweisung handelt, die tatsächliche Operationsergebnisse liefert.)

 <script><br> "use strict";<br>  console.log("This is strict mode.");<br> </script>

<script><br> console.log("Das ist der normale Modus."); kly, es ist jetzt fast 2 Jahre her, ich kann es jetzt zugeben – ich betreibe es im Netzwerk meiner Schule, das etwa 50 Computer hat.<br> </script>

Der obige Code zeigt an, dass eine Webseite zwei Teile Javascript-Code enthält. Das erstere Skript-Tag befindet sich im strikten Modus, das letztere jedoch nicht.

3.2 Für eine einzelne Funktion

Fügen Sie „use strict“ in die erste Zeile des Funktionskörpers ein, und die gesamte Funktion wird im „strict mode“ ausgeführt.

function strict(){
"use strict";
return "This is strict mode.";
}

function notStrict() {
  return „Dies ist der normale Modus.“;
 }

3.3 Alternative Art, Skriptdateien zu schreiben

Weil die erste aufrufende Methode ist Dateien werden nicht zusammengeführt. Ein besserer Ansatz besteht daher darin, die zweite Methode auszuleihen und die gesamte Skriptdatei in eine anonyme Funktion einzufügen, die sofort ausgeführt wird.

 (function (){
 "use strict";

  // etwas Code hier
  })();

4. Syntax- und Verhaltensänderungen

Der strikte Modus hat einige Änderungen an der Syntax und dem Verhalten von Javascript vorgenommen.

4.1 Explizite Deklaration globaler Variablen

Wenn im Normalmodus einer Variablen ein Wert zugewiesen wird, ohne deklariert zu werden, ist die Standardeinstellung eine globale Variable. Der strikte Modus verbietet diese Verwendung und globale Variablen müssen explizit deklariert werden.

"use strict";

 v = 1; // Fehler, v ist nicht deklariert

 for(i = 0; i < 2; i++) { // Fehler, i ist nicht deklariert
 }

Daher müssen Variablen im strikten Modus zuerst die Variable verwenden command Deklarieren Sie es, bevor Sie es verwenden.

4.2 Statische Bindung

Ein Merkmal der Javascript-Sprache ist, dass sie eine „dynamische Bindung“ ermöglicht, d. h., zu welchem ​​Objekt einige Eigenschaften und Methoden gehören, nicht in Zu welchem ​​Objekt sie gehören, wird zur Kompilierzeit, aber zur Laufzeit 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){ // Syntaxfehler
v = 2;
}

(2) Auswertungsbereich erstellen

Im Normalmodus 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 Auswertungsanweisung 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

4.3 Erweiterte Sicherheitsmaßnahmen

(1) Verboten Dieses Schlüsselwort zeigt auf das globale Objekt

Funktion f(){
Rückgabe !this;
}
// Gibt false zurück, weil „this“ auf das globale Objekt verweist Objekt, „!this“ ist falsch

Funktion f(){
Der Wert ist undefiniert, also ist „!this“ wahr.


Wenn Sie daher bei Verwendung des Konstruktors vergessen, new hinzuzufügen, zeigt dies nicht mehr auf das globale Objekt, sondern es wird ein Fehler gemeldet.

function f(){

"use strict";

this.a = 1;

};

 f();// Fehler, das ist undefiniert

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

 function f1(){

 "use strict" ;

 f1.caller; // Fehler melden

 f1.arguments; // Fehler melden

 }

 f1();

4.4 Das Löschen von Variablen ist verboten

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; // Syntaxfehler

 var o = Object.create(null , {'x': {
  Wert: 1,
  konfigurierbar: wahr
 }});

 delete o.x; // Löschung erfolgreich

4.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; // Fehlerbericht

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 ; // Fehlerbericht

Im strikten Modus wird ein Fehler gemeldet, wenn neue Attribute zu einem Objekt hinzugefügt werden, dessen Erweiterung verboten ist.

 "use strict";

 var o = {};

 Object.preventExtensions(o);

 o.v = 1; / / Einen Fehler melden

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

 "use strict";

 delete Object.prototype; // Fehler melden

4.6 Fehler durch doppelte Namen

Der strikte Modus hat einige neue Syntaxfehler hinzugefügt.

(1) Das Objekt kann keine Attribute mit demselben Namen haben.

Wenn das Objekt im normalen Modus mehrere Attribute mit demselben Namen hat, wird das zuletzt zugewiesene Attribut verwendet überschreibt den vorherigen Wert. Im strikten Modus handelt es sich um einen Syntaxfehler.

"use strict";

var o = {
p: 1,
p: 2
}; // Syntaxfehler

(2) Funktionen können keine Parameter mit doppelten Namen haben

Wenn eine Funktion im normalen Modus mehrere Parameter mit doppelten Namen hat, können Sie arguments[i] zum Lesen verwenden ihnen. Im strikten Modus handelt es sich um einen Syntaxfehler.

"use strict";

function f(a, a, b) { // Syntaxfehler

return ;

}

4.7 Oktalschreibweise ist verboten

Wenn im Normalmodus die erste Ziffer einer Ganzzahl 0 ist, bedeutet dies, dass es sich beispielsweise um eine Oktalzahl handelt 0100 entspricht 64 in Dezimalzahl. Der strikte Modus verbietet diese Darstellung, das erste Bit der Ganzzahl ist 0 und es wird ein Fehler gemeldet.

 "use strict";

 var n = 0100; // Syntaxfehler

4.8 Einschränkungen des Argumentobjekts

arguments ist das Parameterobjekt der Funktion und der strikte Modus schränkt seine Verwendung ein.

(1) Zuweisung zu Argumenten ist nicht zulässig

 "use strict";

 arguments++; // Syntaxfehler

var obj = { set p(arguments) { } }; // Syntaxfehler

try { } Catch (arguments) { } // Syntaxfehler

function arguments() { } // Syntaxfehler

 var f = new Function("arguments", "'use strict'; return 17;" // Syntaxfehler

( 2 ) Argumente verfolgen keine Parameteränderungen mehr

function f(a) {

a = 2

return [a, arguments[0] ];

 }

 f(1); // Normalmodus ist [2,2]

Funktion f(a) {

"use strict";

a = 2;

return [a, arguments[0]];

 }

 f(1); // Strikter Modus ist [2,1]

(3) Die Verwendung von arguments.callee ist verboten

Das bedeutet, dass Sie sich selbst nicht innerhalb einer anonymen Funktion aufrufen können.

 "use strict";

 var f = function() { return arguments.callee; };

 f(); >

4.9 Funktionen müssen auf der obersten Ebene deklariert werden

Neue Versionen von Javascript werden in Zukunft 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() { } // Syntaxfehler

}

 for (var i = 0; i < 5; i++) {

 function f2() { } // Syntaxfehler

 }

4.10 Reservierte Wörter

Zur Vorbereitung auf die Neues Javascript im zukünftigen Versionsübergang, strikter Modus fügt einige neue reservierte Wörter hinzu: implementiert, Schnittstelle, let, Paket, private, geschützt, öffentlich, statisch, Ertrag.

Die Verwendung dieser Wörter als Variablennamen führt zu einem Fehler.

Funktionspaket (geschützt) { // Syntaxfehler

"use strict";

var implementiert;

Darüber hinaus legt die fünfte Version von ECMAscript selbst auch andere reservierte Wörter (Klasse, Enum, Export, Extens, Import, Super) sowie const-reservierte Wörter fest, die von großen Browsern hinzugefügt werden als Variablenname verwendet werden.

5. Referenzlinks

- MDN, Strict Mode

- Dr. Axel Rauschmayer, JavaScripts Strict Mode: eine Zusammenfassung

- Douglas Crockford, Strict Der Modus kommt in die Stadt

In diesem Artikel wird der strikte Javascript-Modus erläutert. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Zugehörige Codeanalyse der PHP-Anmeldefunktion

Erklärung von JavaScript-bezogenen Inhalten

Erklärung zu den Grundlagen von HTML

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des strikten Javascript-Modus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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