Mode strict JavaScript (utilisez strict)
Présentation
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 permet à Javascript de s'exécuter dans des conditions plus strictes.
Pourquoi utiliser le mode strict
- Élimine certains aspects déraisonnables et lâches de la syntaxe Javascript et réduit certains comportements étranges ;
- Éliminer certaines insécurités dans l'exécution du code et assurer la sécurité de l'exécution du code ;
- Améliorer l'efficacité du compilateur et augmenter la vitesse d'exécution
- Conçu pour les futures nouvelles versions de Javascript Bonne préfiguration ;
Le « mode strict » reflète l'orientation de développement plus raisonnable, plus sûre et plus rigoureuse de Javascript. Les navigateurs grand public, y compris IE 10, le prennent déjà en charge, et de nombreux grands projets ont commencé à l'adopter pleinement.
D'un autre côté, le même code peut avoir des résultats d'exécution différents en "mode strict" ; certaines instructions qui peuvent être exécutées en "mode normal" ne pourront pas être exécutées en "mode strict". La maîtrise de ces contenus vous aidera à comprendre Javascript plus en détail et fera de vous un meilleur programmeur.
Entrez le drapeau
"use strict";
Comment appeler
1. Pour un seul script
<script>
"utilisez strict";
console. log("C'est le mode strict.");
</script>
2. function
function strict(){
"use strict";
Return "C'est le mode strict."
}
function notStrict() {
return "C'est le mode normal.";
}
3 façons alternatives d'écrire des fichiers de script
(function (){
"use strict";
// du code ici
})();
Exemple 1 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p>浏览器按下 F12 开启调试模式,查看报错信息。</p> <script> "use strict"; x = 3.14; // 报错 (x 未定义) </script> </body> </html>
Exemple 2 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p>浏览器按下 F12 开启调试模式,查看报错信息。</p> <script> x = 3.14; // 不报错 myFunction(); function myFunction() { "use strict"; y = 3.14; // 报错 (y 未定义) } </script> </body> </html>
Changements de syntaxe et de comportement :
1 Déclaration explicite des variables globales
En mode normal, si une variable reçoit une valeur sans être déclarée, elle est par défaut une variable globale. Le mode strict interdit cette utilisation et les variables globales doivent être déclarées explicitement.
"use strict";
v = 1; // Erreur, v n'est pas déclaré
for (i = 0; i < 2; i++) { // Erreur, i n'est pas déclaré
}
Donc, en mode strict, les variables sont Il doit être déclaré avec la commande var avant utilisation.
2 Liaison statique
Une caractéristique du langage Javascript est qu'il permet la "liaison dynamique", c'est-à-dire à quel objet appartiennent certaines propriétés et méthodes , n'est pas déterminé au moment de la compilation, mais au moment de l'exécution.
Le mode strict impose certaines restrictions sur la liaison dynamique. Dans certains cas, seule la liaison statique est autorisée. En d’autres termes, l’objet auquel appartiennent les propriétés et les méthodes est déterminé lors de la phase de compilation. Cela contribuera à améliorer l’efficacité de la compilation, à rendre le code plus facile à lire et à provoquer moins de surprises.
Plus précisément, cela implique les aspects suivants.
(1) Il est interdit d'utiliser l'instruction with
car l'instruction with ne peut pas déterminer au moment de la compilation à quel objet appartient l'attribut.
"use strict";
var v = 1;
avec (o){ // Erreur de syntaxe
v = 2;
}
(2) Créer une portée d'évaluation
En mode normal, le langage Javascript a deux portées variables : la portée globale et la portée de la fonction. Le mode strict crée une troisième portée : la portée d'évaluation.
En mode normal, la portée de l'instruction eval dépend du fait qu'elle se trouve dans la portée globale ou dans la portée de la fonction. En mode strict, l'instruction eval elle-même est une portée et ne peut plus générer de variables globales. Les variables qu'elle génère ne peuvent être utilisées que dans eval.
"use strict";
var x = 2;
console.info(eval(" var x = 5;
3 Mesures de sécurité renforcées (1) Interdire à ce mot-clé de pointer vers l'objet global
fonction f(){
Return !this;
}
// Return false car "this" pointe à l'objet global, "! this" est faux
function f(){
"use strict";
return !this;
}
// Renvoie true, car en mode strict, la valeur de this n'est pas défini, donc "! this" est vrai.
(2) Il est interdit de parcourir la pile d'appels à l'intérieur de la fonctionfonction f1(){
" use strict";
f1.caller; // Rapport d'erreur
f1.arguments; // Rapport d'erreur
>
f1();
4 La suppression des variables est interdite
Ne peut pas être supprimé en mode strict variable. Seuls les attributs d'objet dont la valeur configurable est true peuvent être supprimés.
"use strict";var x;
supprimer x; // Erreur de syntaxe
var o = Object.create(null, {'x' : {
valeur : 1,
configurable : vrai
}});
supprimer o.x ; // Supprimer avec succès
5 Rapport d'erreur explicite
En mode normal, lors de l'attribution d'une valeur à une propriété en lecture seule d'un objet, aucune erreur ne sera signalé, échouent seulement silencieusement. En mode strict, une erreur sera signalée.
"use strict";
var o = {};
Object.defineProperty(o, "v", { valeur : 1, inscriptible : false });
o.v = 2; // Rapport d'erreur
En mode strict, utilisez If l'attribut lu par la méthode getter se voit attribuer une valeur, une erreur sera signalée.
"use strict";
var o = {
get v () { return 1; }
};
o.v = 2; // Rapport d'erreur
Strict Dans ce mode, l'ajout de nouveaux attributs à un objet dont l'expansion est interdite entraînera une erreur.
"use strict";
var o = {};
Object.preventExtensions(o) ;
o.v = 1; // Rapport d'erreur
En mode strict, si vous supprimez un attribut qui ne peut pas être supprimé, une erreur sera signalée.
"use strict";
delete Object.prototype; // Rapport d'erreur
6 Erreurs de nom en double
Le mode strict a ajouté de nouvelles erreurs de syntaxe.
(1) Les objets ne peuvent pas avoir d'attributs avec des noms en double
En mode normal, si un objet a plusieurs attributs avec des noms en double, le dernier attribut attribué écrasera la valeur précédente. En mode strict, il s'agit d'une erreur de syntaxe.
"use strict";
var o = {
p : 1,
p : 2
} ; // Erreur de syntaxe
(2) Les fonctions ne peuvent pas avoir de paramètres avec des noms en double
En mode normal, si la fonction a plusieurs paramètres portant le même nom, vous pouvez utiliser les arguments[i] pour les lire. En mode strict, il s'agit d'une erreur de syntaxe.
"use strict";
fonction f(a, a, b) { // Erreur de syntaxe
return ;
}
7 La notation octale est interdite
En mode normal, si le premier chiffre d'un entier est 0, cela signifie qu'il s'agit d'un nombre octal. Par exemple, 0100 est égal à 64 en décimal. Le mode strict interdit cette représentation, le premier bit de l'entier est 0, et une erreur sera signalée.
"use strict";
var n = 0100; // Erreur de syntaxe
8 Limitations de l'objet arguments
arguments est l'objet paramètre de la fonction, et le mode strict restreint son utilisation.
(1) L'affectation aux arguments n'est pas autorisée
"use strict";
arguments++; // Erreur de syntaxe
var obj = { set p(arguments) { } }; // Erreur de syntaxe
try { } catch (arguments) { } // Syntaxe erreur
function arguments() { } // Erreur de syntaxe
var f = new Function("arguments", "'use strict' ; return 17;"); // Erreur de syntaxe
(2) les arguments ne suivent plus les modifications des paramètres
fonction f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // Le mode normal est [2,2]
fonction f(a) {
"utiliser strict";
a = 2;
return [a, arguments[0]];
}
f(1); // Le mode strict est [2); ,1]
(3) Il est interdit d'utiliser arguments.callee
Cela signifie que vous ne pouvez pas vous appeler à l'intérieur d'une fonction anonyme.
"use strict";
var f = function() { return arguments.callee;
f(); // Rapport d'erreur
9 La fonction doit être déclarée au niveau supérieur
Les nouvelles versions de Javascript à l'avenir introduiront une « portée au niveau du bloc ». Afin de rester conforme à la nouvelle version, le mode strict permet uniquement de déclarer les fonctions dans la portée globale ou le niveau supérieur de la portée de la fonction. Autrement dit, il n'est pas autorisé de déclarer des fonctions dans un bloc de code non fonctionnel.
"use strict";
if (true) {
function f() { } / / Erreur de syntaxe
}
pour (var i = 0; i < 5; i++) {
fonction f2() { } // Erreur de syntaxe
}
10 Mots réservés
Afin de passer aux nouvelles versions de Javascript à l'avenir, le mode strict a ajouté de nouveaux mots réservés : implémente, interface, let, package, privé, protégé, public, statique, rendement .
L'utilisation de ces mots comme noms de variables entraînera une erreur.
function package(protected) { // Erreur de syntaxe
"use strict";
var implémente ; // Erreur de syntaxe
}