Maison > interface Web > js tutoriel > le corps du texte

Comprendre le mode strict dans les astuces javascript_javascript

WBOY
Libérer: 2016-05-16 15:16:54
original
1931 Les gens l'ont consulté

1. Qu'est-ce que le mode strict
Le code JavaScript que nous écrivons habituellement s'exécute généralement en mode normal. En plus du mode d'exécution normal, ECMAscript 5 ajoute un deuxième mode d'exécution : le « mode strict ». Comme son nom l'indique, ce mode permettra à JavaScript de s'exécuter dans un environnement plus strict.
Les principaux navigateurs, dont IE 10, le prennent déjà en charge, et de nombreux grands projets ont commencé à l'adopter pleinement. (De nombreux projets sur github utilisent le mode strict)
2. Activer le mode strict
Activer le mode strict pour l'ensemble du script
Mettez une instruction spécifique "use strict";
avant toutes les instructions Supposons qu'il existe un script reeoo.js, vous pouvez activer le mode strict comme ceci :

"use strict";
var name = "Reeoo";
console.log(name);
Copier après la connexion

Il y a des pièges naturels dans cette façon d'écrire MAIS si on veut fusionner le code, je vais maintenant fusionner heigui.js :
.

heigui = "db";
Copier après la connexion

Fusionner avec reeoo.js. Il est bon que les deux scripts soient exécutés séparément, mais une erreur sera signalée lorsqu'ils seront combinés.
Uncaught ReferenceError : heigui n'est pas défini(…)
La fusion d'un script en mode strict et d'un script en mode non strict peut amener le code du script en mode non strict à signaler une erreur. Il est recommandé que le code soit encapsulé dans une fonction d'exécution immédiate.

(function(){
 "use strict";
 var name = "reeoo";
})();

(function(){
 heigui = "db";
})();
Copier après la connexion

De cette façon, aucune erreur ne sera signalée après la fusion.
Activer le mode strict pour une fonction
Pour activer le mode strict pour une fonction, placez simplement l'instruction "use strict" avant toutes les instructions dans le corps de la fonction.

function strictFun()
{
 // 函数级别严格模式语法
 'use strict';
 console.log('I am a strictmode function!');
}

function normalFun() { 
 console.log('I am a mormal function!');
}
Copier après la connexion

Débogage du mode strict dans Chrome
J'ai ce morceau de code :

'use strict'
name = "reeoo";
console.log(name)
Copier après la connexion

Collez ce code directement dans la console Chrome et exécutez-le. Dans des circonstances normales, une erreur devrait être signalée, mais aucune erreur n'est signalée.


Évidemment, en mode strict, il est illégal de déclarer des variables sans var, mais pourquoi aucune erreur n'est-elle signalée ?
Qu'est-ce que c'est ? Chrome ne prend-il pas en charge le mode strict ? Quelle blague. . .
Après une recherche en ligne, il s'avère que le code de la console de Chrome s'exécute en eval et que vous ne pouvez pas utiliser le mode strict pour la fonction eval (cela n'est peut-être pas tout à fait correct, mais ce que fait exactement Chrome est inconnu), comme indiqué ci-dessous. Expliquez que la fonction eval peut utiliser le mode strict :

Pour signaler correctement les erreurs en mode strict dans le navigateur Chrome, vous devez envelopper une fonction d'exécution immédiate en dehors du code, ou d'autres mesures similaires.

(function(){
 'use strict'
 name = "reeoo";
 console.log(name) 
})()
Copier après la connexion

C'est tout
Mode strict de débogage du papier brouillon du code FireFox
Chrome nous oblige à inclure une couche de fermetures pour exécuter le mode strict. Comme c'est si gênant, existe-t-il un autre moyen d'exécuter directement du code en mode strict ?
FireFox dispose d'un papier brouillon de code que vous pouvez exécuter directement. La touche de raccourci est SHIFT F4
.

Quelle est la rigueur du mode strict
Quelques limitations importantes en mode strict

1. Déclaration des variables
L'utilisation d'une variable non déclarée n'est pas autorisée

"use strict";
name = "reeoo";
Copier après la connexion

Rapport d'erreurs (projet de code, le même ci-dessous)
Exception : ReferenceError : affectation à un nom de variable non déclaré

2. Modifier la valeur de l'attribut en lecture seule

"use strict";
var testObj = Object.defineProperties({}, {
 prop1: {
 value: 10,
 writable: false // 一个只读的属性
 },
 prop2: {
 get: function () {
 }
 }
});
testObj.prop1 = 20; //尝试改变prop1的值
testObj.prop2 = 30;//尝试改变prop2的值
Copier après la connexion

Une erreur sera signalée en mode strict :
Uncaught TypeError : impossible d'attribuer la propriété en lecture seule 'prop1' de #
Le mode le plus non strict signifie que la valeur ne peut pas être attribuée et qu'aucune erreur ne sera signalée

3. Modifier les attributs non extensibles
se comporte comme l'ajout d'une propriété à un objet avec la propriété extensible définie sur false.

"use strict";
var testObj = new Object();
Object.preventExtensions(testObj);//经过这个方法处理过的对象,不影响原有对象的删除,修改.但是无法添加新的属性成员了.
testObj.name = "reeoo";
Copier après la connexion

Erreur de mode strict :
Erreur de type non interceptée : impossible d'ajouter le nom de la propriété, l'objet n'est pas extensible
Le mode non strict ne signalera pas d'erreur, mais testObj ne sera pas développé.
4. Supprimer des variables, des fonctions ou des paramètres
Supprimez les propriétés dont l'attribut configurable est défini sur false.

"use strict";
var testvar = 15,testObj={};
function testFunc() {};
delete testvar;
delete testFunc;

Object.defineProperty(testObj, "testvar", {
 value: 10,
 configurable: false
 });
delete testObj.testvar;
Copier après la connexion

报错:
Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

5、在一个对象文本中多次定义某个属性
严格模式下不允许一个属性有多个定义

"use strict";
var testObj = {
 prop1: 10,
 prop2: 15,
 prop1: 20
};
Copier après la connexion

报错(node控制台)
Duplicate data property in object literal not allowed in strict mode
正常模式中后声明的重复的变量会覆盖前面声明的,而且不会报错。
注:这个问题在ECMAScript6中已被修复。

6、严格模式下不允许形参参数名称重复

"use strict";
function testFunc(param1, param1) {
 return 1;
};
Copier après la connexion

报错:
Uncaught SyntaxError: Duplicate parameter name not allowed in this context

7、无法使用标识符的未来保留字。严格模式下将保留标识符名称
一下标识符(ES6中依然没有实现的)在严格模式中是不能使用的,否则也会报错。
用了就是这个下场:
Uncaught SyntaxError: Unexpected strict mode reserved word

  • implements
  • interface
  • package
  • private
  • protected
  • public
  • static
  • yield

8、严格模式下不允许使用八进制数字参数和转义字符

"use strict";
var testoctal = 010;
var testescape = \010;
Copier après la connexion

报错:
Uncaught SyntaxError: Unexpected token ILLEGAL(…)
9、当this 的值为 null 或 undefined 时,该值不会转换为全局对象
比如:

"use strict";
function testFunc() {
 return this;
}
var testvar = testFunc();
Copier après la connexion

在非严格模式下,testvar 的值为全局对象window,但在严格模式下,该值为 undefined。

10、字符串"eval"不能用作标识符(变量或函数名、参数名等)

"use strict";
var eval = "hehe";
Copier après la connexion

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() {};
}
Copier après la connexion

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);
Copier après la connexion

Uncaught ReferenceError: testvar is not defined

13、严格模式下"arguments"用法无效
字符串”arguments”不能用作标识符(变量或函数名、参数名等)。

"use strict";
var arguments = 1;
Copier après la connexion

Uncaught SyntaxError: Unexpected eval or arguments in strict mode

这个跟上面第10条的限制是差不多的。
14、函数内的 arguments,无法更改arguments 对象的成员的值

"use strict";
function testArgs(oneArg) {
 arguments[0] = 20;
}
Copier après la connexion

在非严格模式下,可以通过更改 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);
Copier après la connexion

用了的下场就是这样:
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);
}
Copier après la connexion

Uncaught SyntaxError: Strict mode code may not include a with statement
为什么要使用严格模式
既然这种模式这么多限制,我为什么还要用呢?闲得蛋疼吗?当然8是,
JavaScript作为一门一开始用于浏览器的脚本语言,容错性非常好,即使有时候你的代码写的不标准,也不会报错,但这有时候会变成代码隐患。开启了严格模式之后,JavaScript的一些不合理的不严谨的语法都会得到控制,让你能够更严谨的书写JavaScript代码,成为一个更好的程序员。严格模式是ES5时代的产物,ES2015已经在普及的路上,是时候使用严格模式了!

参考
  1. 严格模式
  2. 严格模式

原文:http://reeoo.me/archives/strictmode.html

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal