Heim > Artikel > Web-Frontend > Grundlegendes zum strikten Modus in Javascript_Javascript-Tipps
1. Was ist der strikte Modus?
Der JavaScript-Code, den wir normalerweise schreiben, läuft im Allgemeinen im normalen Modus. Zusätzlich zum normalen Ausführungsmodus fügt ECMAscript 5 einen zweiten Ausführungsmodus hinzu: „Strikter Modus“. Wie Sie am Namen erkennen können, führt dieser Modus dazu, dass JavaScript in einer strengeren Umgebung ausgeführt wird.
Große Browser, darunter IE 10, unterstützen es bereits und viele große Projekte haben damit begonnen, es vollständig zu nutzen. (Viele Projekte auf Github verwenden den strikten Modus)
2. Aktivieren Sie den strikten Modus
Strikten Modus für das gesamte Skript aktivieren
Setzen Sie vor allen Anweisungen eine bestimmte Anweisung „use strict“;
Angenommen, es gibt ein Skript reeoo.js, dann können Sie den strikten Modus wie folgt aktivieren:
"use strict"; var name = "Reeoo"; console.log(name);
Bei dieser Schreibweise gibt es natürliche Fallstricke, ABER wenn wir den Code zusammenführen wollen, werde ich jetzt heigui.js zusammenführen:
heigui = "db";
Mit reeoo.js zusammenführen. Es ist gut, wenn die beiden Skripte separat ausgeführt werden, bei der Kombination wird jedoch ein Fehler gemeldet.
Uncaught ReferenceError: heigui ist nicht definiert(…)
Das Zusammenführen eines Skripts im strikten Modus und eines Skripts im nicht strikten Modus kann dazu führen, dass der Skriptcode im nicht strikten Modus einen Fehler meldet. Es wird empfohlen, den Code in eine Funktion zur sofortigen Ausführung einzuschließen.
(function(){ "use strict"; var name = "reeoo"; })(); (function(){ heigui = "db"; })();
Auf diese Weise werden nach dem Zusammenführen keine Fehler gemeldet.
Strikten Modus für eine Funktion aktivieren
Um den strikten Modus für eine Funktion zu aktivieren, fügen Sie einfach die Anweisung „use strict“ vor allen Anweisungen im Funktionskörper ein.
function strictFun() { // 函数级别严格模式语法 'use strict'; console.log('I am a strictmode function!'); } function normalFun() { console.log('I am a mormal function!'); }
Debuggen des strengen Modus in Chrome
Ich habe diesen Code:
'use strict' name = "reeoo"; console.log(name)
Fügen Sie diesen Code direkt in die Chrome-Konsole ein und führen Sie ihn aus. Unter normalen Umständen sollte ein Fehler gemeldet werden, aber kein Fehler
Was zum Teufel ist das? Unterstützt Chrome den strikten Modus nicht? Was für ein Witz. . .
Nach einer Online-Suche stellte sich heraus, dass der Konsolencode von Chrome in EVAL ausgeführt wird und Sie für die Evaluierungsfunktion keinen strengen Modus verwenden können (dies ist möglicherweise nicht ganz korrekt, aber was genau Chrome tut, ist unbekannt), wie unten gezeigt. Erklären Sie die Evaluierungsfunktion kann den strikten Modus verwenden:
Um Fehler im strikten Modus im Chrome-Browser ordnungsgemäß zu melden, müssen Sie eine sofortige Ausführungsfunktion außerhalb des Codes einbinden oder andere ähnliche Maßnahmen ergreifen.
(function(){ 'use strict' name = "reeoo"; console.log(name) })()
FireFox-Code-Scratch-Paper-Debugging im strengen Modus
Chrome erfordert, dass wir eine Abschlussschicht einschließen, um den Strict-Modus auszuführen. Da dies so problematisch ist, gibt es eine andere Möglichkeit, den Strict-Mode-Code direkt auszuführen.
FireFox verfügt über ein Code-Scratch-Paper, das Sie direkt ausführen können. Die Tastenkombination ist UMSCHALTF4
Wie streng ist der strikte Modus
Einige wichtige Einschränkungen im strikten Modus
1. Variablendeklaration
Die Verwendung einer nicht deklarierten Variablen ist nicht zulässig
"use strict"; name = "reeoo";
Ausnahme: ReferenceError: Zuweisung an nicht deklarierten Variablennamen
2. Ändern Sie den Wert des schreibgeschützten Attributs
"use strict"; var testObj = Object.defineProperties({}, { prop1: { value: 10, writable: false // 一个只读的属性 }, prop2: { get: function () { } } }); testObj.prop1 = 20; //尝试改变prop1的值 testObj.prop2 = 30;//尝试改变prop2的值
Nicht erfasster Typfehler: Die schreibgeschützte Eigenschaft „prop1“ von #a87fdacec66f0909fc0757c19f2d2b1d kann nicht zugewiesen werden
Der nicht strengste Modus bedeutet, dass der Wert nicht zugewiesen werden kann und kein Fehler gemeldet wird
3. Nicht erweiterbare Attribute ändern
verhält sich wie das Hinzufügen einer Eigenschaft zu einem Objekt, wobei die erweiterbare Eigenschaft auf „false“ gesetzt ist.
"use strict"; var testObj = new Object(); Object.preventExtensions(testObj);//经过这个方法处理过的对象,不影响原有对象的删除,修改.但是无法添加新的属性成员了. testObj.name = "reeoo";
Unabgefangener Typfehler: Eigenschaftsname kann nicht hinzugefügt werden, Objekt ist nicht erweiterbar
Der nicht strikte Modus meldet keinen Fehler, testObj wird jedoch nicht erweitert.
4. Variablen, Funktionen oder Parameter löschen
Eigenschaften entfernen, deren konfigurierbares Attribut auf „false“ gesetzt ist.
"use strict"; var testvar = 15,testObj={}; function testFunc() {}; delete testvar; delete testFunc; Object.defineProperty(testObj, "testvar", { value: 10, configurable: false }); delete testObj.testvar;
报错:
Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
5、在一个对象文本中多次定义某个属性
严格模式下不允许一个属性有多个定义
"use strict"; var testObj = { prop1: 10, prop2: 15, prop1: 20 };
报错(node控制台)
Duplicate data property in object literal not allowed in strict mode
正常模式中后声明的重复的变量会覆盖前面声明的,而且不会报错。
注:这个问题在ECMAScript6中已被修复。
6、严格模式下不允许形参参数名称重复
"use strict"; function testFunc(param1, param1) { return 1; };
报错:
Uncaught SyntaxError: Duplicate parameter name not allowed in this context
7、无法使用标识符的未来保留字。严格模式下将保留标识符名称
一下标识符(ES6中依然没有实现的)在严格模式中是不能使用的,否则也会报错。
用了就是这个下场:
Uncaught SyntaxError: Unexpected strict mode reserved word
8、严格模式下不允许使用八进制数字参数和转义字符
"use strict"; var testoctal = 010; var testescape = \010;
报错:
Uncaught SyntaxError: Unexpected token ILLEGAL(…)
9、当this 的值为 null 或 undefined 时,该值不会转换为全局对象
比如:
"use strict"; function testFunc() { return this; } var testvar = testFunc();
在非严格模式下,testvar 的值为全局对象window,但在严格模式下,该值为 undefined。
10、字符串"eval"不能用作标识符(变量或函数名、参数名等)
"use strict"; var eval = "hehe";
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
11、在严格模式下,函数声明无法嵌套在语句或块中。它们只能显示在顶级或直接显示在函数体中
"use strict"; var arr = [1, 2, 3, 4, 5]; var index = null; for (index in arr) { function myFunc() {}; }
node控制台:
SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.
但是这个限制已经在ES6中被修复
12、严格模式下eval用法无效
如果在 eval 函数内声明变量,则不能在此函数外部使用该变量。
"use strict"; eval("var testvar = 10"); console.log(testvars);
Uncaught ReferenceError: testvar is not defined
13、严格模式下"arguments"用法无效
字符串”arguments”不能用作标识符(变量或函数名、参数名等)。
"use strict"; var arguments = 1;
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
这个跟上面第10条的限制是差不多的。
14、函数内的 arguments,无法更改arguments 对象的成员的值
"use strict"; function testArgs(oneArg) { arguments[0] = 20; }
在非严格模式下,可以通过更改 arguments[0] 的值来更改 oneArg 参数的值,从而使 oneArg 和 arguments[0] 的值都为 20。在严格模式下,更改 arguments[0] 的值不会影响 oneArg 的值,因为 arguments 对象只是一个本地副本。
15、不允许使用arguments.callee
"use strict"; function my(testInt) { if (testInt-- == 0) return; arguments.callee(testInt--); } my(100);
用了的下场就是这样:
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
16、不允许使用with
"use strict"; with (Math){ x = cos(3); y = tan(7); }
Uncaught SyntaxError: Strict mode code may not include a with statement
为什么要使用严格模式
既然这种模式这么多限制,我为什么还要用呢?闲得蛋疼吗?当然8是,
JavaScript作为一门一开始用于浏览器的脚本语言,容错性非常好,即使有时候你的代码写的不标准,也不会报错,但这有时候会变成代码隐患。开启了严格模式之后,JavaScript的一些不合理的不严谨的语法都会得到控制,让你能够更严谨的书写JavaScript代码,成为一个更好的程序员。严格模式是ES5时代的产物,ES2015已经在普及的路上,是时候使用严格模式了!