Maison >interface Web >js tutoriel >Explication détaillée du mode strict Javascript

Explication détaillée du mode strict Javascript

jacklove
jackloveoriginal
2018-06-11 22:19:031472parcourir

1. Présentation

En plus du mode de fonctionnement normal, ECMAscript 5 ajoute un deuxième mode de fonctionnement : le « mode strict ». Comme son nom l'indique, ce mode permet à Javascript de s'exécuter dans des conditions plus strictes.

Les principaux objectifs de l'établissement du "mode strict" sont les suivants :

- Éliminer certains aspects déraisonnables et imprécis de la syntaxe Javascript et réduire certains comportements étranges ;

 - Éliminer certains aspects dangereux de l'exécution du code et garantir la sécurité de l'exécution du code ;

 - Améliorer l'efficacité du compilateur et augmenter la vitesse d'exécution

 - Ouvrir la voie à de nouvelles fonctionnalités ; versions de Javascript à l'avenir.

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.

Cet article présentera le « mode strict » en détail.

2. Signe d'entrée

Le signe d'entrée en « mode strict » est la ligne suivante :

 "use strict";

Les anciennes versions des navigateurs le traiteront comme une ligne de chaînes ordinaires et l'ignoreront.

3. Comment appeler

Le "mode strict" propose deux méthodes d'appel, qui conviennent à différentes occasions.

3.1 Pour l'intégralité du fichier de script

mettez "use strict" dans la première ligne du fichier de script, puis l'ensemble du script s'exécutera en "mode strict". Si cette ligne d'instruction n'est pas la première ligne, elle n'a aucun effet et l'ensemble du script s'exécute en « mode normal ». Cela nécessite une attention particulière si des fichiers de code de différents modes sont fusionnés en un seul fichier.

(À proprement parler, tant que l'instruction précédente n'est pas une instruction qui produit des résultats d'opération réels, "use strict" n'a pas besoin d'être sur la première ligne, par exemple directement après un point-virgule vide.)

 <script><br> "use strict";<br>  console.log("Ceci est le mode strict.");<br> </script>

<script><br> console.log("C'est le mode normal."); en fait, cela fait presque 2 ans maintenant, je peux l'admettre maintenant - je l'exécute sur le réseau de mon école qui compte environ 50 ordinateurs.<br> </script>

Le code ci-dessus indique qu'il y a deux morceaux de code Javascript dans une page Web. La première balise de script est en mode strict, mais la seconde ne l'est pas.

3.2 Pour une seule fonction

Mettez "use strict" sur la première ligne du corps de la fonction, et la fonction entière s'exécutera en "mode strict".

function strict(){
"use strict";
return "Ceci est le mode strict.";
}

function notStrict() {
  return "C'est le mode normal.";
 }

3.3 Manière alternative d'écrire des fichiers de script

Parce que la première méthode d'appel est Les fichiers ne sont pas fusionnés, une meilleure approche consiste donc à emprunter la deuxième méthode et à placer l'intégralité du fichier de script dans une fonction anonyme qui est exécutée immédiatement.

 (function (){
 "use strict";

  // du code ici
  })();

4. Modifications de la syntaxe et du comportement

Le mode strict a apporté quelques modifications à la syntaxe et au comportement de Javascript.

4.1 Déclaration explicite des variables globales

En mode normal, si une variable se voit attribuer une valeur sans être déclarée, la valeur par défaut est 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 doivent d'abord utiliser la var commande Déclarez-le avant de l'utiliser.

4.2 Liaison statique

Une caractéristique du langage Javascript est qu'il permet une "liaison dynamique", c'est-à-dire à quel objet appartiennent certaines propriétés et méthodes, pas dans à quel objet ils appartiennent. Cela est 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; x")); 5

 console.info(x); // 2

4.3 Mesures de sécurité renforcées

(1) Interdit Le ce mot-clé pointe vers l'objet global

Function f(){
Return !this;
}
// Renvoie false car "this" pointe vers l'objet global object, "!this" est faux

 function f(){
 "use strict";
  return !this;
 }
  // Renvoie vrai, car en mode strict , this La valeur de n'est pas définie, donc "!this" est vrai.

Par conséquent, lors de l'utilisation du constructeur, si vous oubliez d'ajouter new, cela ne pointera plus vers l'objet global, mais une erreur sera signalée.

fonction f(){

"utiliser strict";

this.a = 1;

};

 f();// Erreur, ce n'est pas défini

(2) Il est interdit de parcourir la pile d'appels au sein de la fonction

 function f1(){

 "use strict" ;

 f1.caller; // Rapport d'erreur

 f1.arguments; // Rapport d'erreur

 }

 f1();

4.4 La suppression des variables est interdite

Les variables ne peuvent pas être supprimées en mode strict. Seules les propriétés d'objet dont le paramètre configurable est défini sur true peuvent être supprimées.

 "use strict";

 var x;

 delete x; // Erreur de syntaxe

 var o = Object.create(null , {'x' : {
  value : 1,
  configurable : true
 }});

 delete o.x // Suppression réussie

4.5 Rapport d'erreur explicite

En mode normal, l'attribution d'une valeur à une propriété en lecture seule d'un objet ne signalera pas d'erreur, mais échouera 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, une erreur sera signalée lors de l'attribution d'une valeur à une propriété lue à l'aide de la méthode getter.

"use strict";
var o = {
get v() { return 1>

};

o.v = 2 ; // Rapport d'erreur

En mode strict, une erreur sera signalée lors de l'ajout de nouveaux attributs à un objet dont l'expansion est interdite.

 "use strict";

 var o = {};

 Object.preventExtensions(o);

 o.v = 1 / / Signaler une 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; // Signaler une erreur

4.6 Erreurs de nom en double

Le mode strict a ajouté de nouvelles erreurs de syntaxe.

(1) L'objet ne peut pas avoir d'attributs du même nom

En mode normal, si l'objet a plusieurs attributs du même nom, le dernier attribut attribué sera écraser 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 une fonction a plusieurs paramètres avec des noms en double, vous pouvez utiliser des arguments[i] pour lire eux. En mode strict, il s'agit d'une erreur de syntaxe.

"use strict";

function f(a, a, b) { // Erreur de syntaxe

return ;

}

4.7 Interdire la représentation octale

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

4.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) { } // Erreur de syntaxe

function arguments() { } // Erreur de syntaxe

 var f = new Function("arguments", "'use strict'; return 17;"); // Erreur de syntaxe

( 2) les arguments ne suivent plus les changements de paramètres

function f(a) {

a = 2

return [a, arguments[0] ];

 }

 f(1); // Le mode normal est [2,2]

Fonction f(a) {

"use 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 dans une fonction anonyme.

 "use strict";

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

 f(); // Signaler une erreur

4.9 Les fonctions doivent être déclarées au niveau supérieur

Les nouvelles versions de Javascript introduiront à l'avenir 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++) {

 function f2() { } // Erreur de syntaxe

 }

4.10 Mots réservés

Afin de préparer le nouveau Javascript dans le futur Transition de version, le mode strict a ajouté quelques 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.

Package de fonctions (protégé) { // Erreur de syntaxe

"use strict"

var Implements ; // Erreur de syntaxe

}

De plus, la cinquième version d'ECMAscript elle-même stipule également d'autres mots réservés (class, enum, export, extends, import, super), ainsi que les mots réservés const ajoutés par les principaux navigateurs. être utilisé comme nom de variable.

5. Liens de référence

- MDN, mode strict
- Dr Axel Rauschmayer, le mode strict de JavaScript : un résumé
- Douglas Crockford, Strict Le mode arrive en ville

Cet article explique le mode strict Javascript Pour plus de contenu connexe, veuillez faire attention au site Web chinois php.

Recommandations associées :

Analyse du code associé à la fonction de connexion PHP

Explication du contenu lié à JavaScript

Explication sur les bases du HTML

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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