"Mode strict" est une nouvelle syntaxe définie dans ECMA-262 Edition 5, indiquant qu'il doit être exécuté en utilisant une syntaxe JavaScript stricte. Certaines méthodes d'écriture d'occasion dans le passé jetteront des exceptions de syntaxerror, telles que:
1. Aucune déclaration VAR avant la variable
2. Utilisez la syntaxe octale: var n = 023 et var s = "/ 047"
3. Utiliser avec des déclarations
4. Utilisez Delete pour supprimer un nom de variable (pas le nom d'attribut): Supprimer MyVariable
5. Utilisez l'évaluation ou les arguments comme nom de variable ou nom de fonction
6. Utiliser les mots réservés futurs (peut-être utilisés dans ECMAScript 6): Implémentés, interface, let, package, privé, protégé, public, statique et rendement en tant que noms de variables ou noms de fonction
7. Utiliser la déclaration de la fonction dans le bloc d'instruction: if (a <b) {fonction f () {}}
8. Autres erreurs
8.1. Utilisez deux noms d'attribut identiques dans la taille de la sous-face d'objet: {a: 1, b: 3, a: 7}
8.2. Utilisez deux noms de paramètres identiques dans les paramètres de fonction: fonction f (a, b, b) {}
Ceux-ci sont expliqués en détail ci-dessous.
1. Pourquoi utiliser "mode strict"
Le but de l'établissement d'un "modèle strict" est principalement le suivant:
1. Éliminez certains aspects déraisonnables et imparfaits de la syntaxe JavaScript et réduisez certains comportements étranges;
2. Éliminez certaines insécurités dans le code en cours d'exécution et assurez la sécurité du code en cours d'exécution;
3. Améliorer l'efficacité du compilateur et augmenter la vitesse de fonctionnement;
4. Posez les bases de la nouvelle version de JavaScript à l'avenir.
Le "mode strict" reflète la direction de développement plus raisonnable, plus sûre et plus rigoureuse du JavaScript. Les navigateurs grand public, dont IE 10, l'ont déjà soutenu, et de nombreux projets majeurs ont commencé à l'adopter entièrement.
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 seront pas exécutées en "mode strict". La maîtrise de ces contenus vous aidera à comprendre JavaScript plus soigneusement et en profondeur, ce qui fait de vous un meilleur programmeur.
Cet article donnera une introduction détaillée au "modèle strict".
2. Déclarer "mode strict"
Déclarer le "mode strict" est simple et n'a qu'une seule déclaration:
La copie de code est la suivante: "Utiliser Strict";
Remarque: les navigateurs plus âgés le traiteront comme une chaîne normale et l'ignoreront.
3. Déclarer l'emplacement et la relation contextuelle du "mode strict"
Le "mode strict" affecte principalement la portée où elle est située. S'il est utilisé dans les fonctions, il ne transformera pas la portée globale et d'autres fonctions inutilisées en "mode strict". C'est-à-dire que la portée d'une déclaration de schémas stricte dépend de son contexte. Si le mode strict est déclaré dans un contexte global (en dehors de la portée d'une fonction), tout le code du programme est en mode strict. Si un modèle strict est déclaré dans une fonction, tout le code de la fonction est en schéma strict. Par exemple, dans l'exemple suivant, tout le code est en mode strict, et les déclarations de variables en dehors de la fonction entraîneront une erreur de syntaxe: "Les variables ne sont pas définies en mode strict". Il existe deux façons d'appeler "Mode strict" et conviennent à différentes occasions.
1. Pour l'ensemble du fichier de script
Mettez "Utiliser Strict" dans la première ligne du fichier de script et l'ensemble du script s'exécutera en "mode strict". Si cette déclaration de ligne n'est pas sur la première ligne, elle n'est pas valide et l'ensemble du script s'exécute en "mode normal". Cela nécessite une attention particulière si les fichiers de code de différents modes sont fusionnés en un seul fichier.
(À proprement parler, tant que la déclaration qui produit le résultat de course réel n'est pas précédée, "utiliser strict" peut ne pas être sur la première ligne, comme le suivant directement un point-virgule vide.)
La copie de code est la suivante:
<cript>
"Utilisez strict";
console.log ("Ceci est un mode strict.");
</cript>
<cript>
console.log ("Ceci est le mode normal.");
</cript>
Le code ci-dessus indique qu'il y a à tour deux pièces de code JavaScript dans une page Web. La balise de script précédente est en mode strict, ce dernier ne l'est pas.
2. Pour une seule fonction
Mettez "Utiliser Strict" dans la première ligne du corps de fonction, et la fonction entière s'exécute en "mode strict".
La copie de code est la suivante:
fonction strict () {
"Utilisez strict";
Retour "Ceci est un schéma strict.";
}
fonction notstrict () {
Retour "Ceci est le mode normal";
}
3. SULLAGES POUR LES Fichiers de script
Étant donné que la première méthode d'appel n'est pas propice à la fusion de fichiers, il est préférable d'emprunter la deuxième méthode et de placer l'intégralité du fichier de script dans une fonction anonyme qui est exécutée immédiatement.
La copie de code est la suivante:
(fonction (){
"Utilisez strict";
// du code ici
}) ();
4. La syntaxe et le comportement changent en "mode strict"
"Mode strict" a apporté quelques modifications à la syntaxe et au comportement de JavaScript.
1. Déclaration explicite des variables globales
En mode normal, lorsque vous utilisez des variables, nous n'avons pas à utiliser VAR pour déclarer (déclarer explicitement), mais en mode strict, nous devons utiliser VAR pour déclarer avant d'utiliser des variables, sinon une erreur se produira.
La copie de code est la suivante:
"Utilisez strict";
v = 1; // une erreur est signalée, v n'est pas déclaré
pour (i = 0; i <2; i ++) {// Une erreur a été signalée, je n'ai pas été déclaré
}
Par conséquent, en mode strict, les variables doivent être déclarées avec la commande var avant utilisation.
2. Liaison statique
Une caractéristique du langage JavaScript est qu'elle permet de «liaison dynamique», c'est-à-dire à laquelle certaines propriétés et méthodes appartiennent, n'est pas déterminée au moment de la compilation, mais au moment de l'exécution.
Le mode strict impose certaines restrictions à la liaison dynamique. Dans certains cas, seule la liaison statique est autorisée. En d'autres termes, qui s'oppose aux attributs et aux méthodes auxquels appartiennent est déterminé pendant l'étape de compilation. Cela contribuera à améliorer l'efficacité de la compilation, à rendre le code plus facile à lire et à moins d'accidents.
Plus précisément, les aspects suivants sont impliqués.
(1) l'utilisation avec les déclarations est interdite
Parce que l'instruction avec ne peut pas être déterminée au moment de la compilation, à laquelle appartient l'attribut.
La copie de code est la suivante:
"Utilisez 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 lunettes 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 de l'évaluation.
En mode normal, la portée de l'instruction EVAL dépend de la portée globale ou de la portée fonctionnelle. En mode strict, l'instruction EVAL elle-même est une portée et ne peut plus générer des variables globales. Les variables qu'il génère ne peuvent être utilisées qu'à l'intérieur de l'év.
La copie de code est la suivante:
"Utilisez strict";
var x = 2;
Console.info (EVAL ("var x = 5; x")); // 5
console.info (x); // 2
3. Mesures de sécurité améliorées
(1) interdire à ce mot clé pour pointer des objets globaux
La copie de code est la suivante:
fonction f () {
retour! ceci;
}
// retourne faux, parce que "ce" pointe vers l'objet global "! Ce" est faux
fonction f () {
"Utilisez strict";
retour! ceci;
}
// Renvoie vrai, car en mode strict, la valeur de ceci n'est pas définie, donc "! Ce" est vrai.
Par conséquent, lorsque vous utilisez le constructeur, si vous oubliez d'ajouter de nouveau, cela ne pointe plus à l'objet global, mais rapporte une erreur.
La copie de code est la suivante:
fonction f () {
"Utilisez strict";
this.a = 1;
};
f (); // erreur, ce n'est pas défini
Dans la fonction ordinaire, appelez f (), la valeur de cela pointera vers l'objet global. En mode strict, la valeur de cela pointera vers un non-défini. Lorsque la fonction est appelée via l'appel et s'applique, si le paramètre de valeur passé est une valeur primitive (chaîne, nombre, valeur booléenne) à l'exception de Null et non défini, la valeur de celle-ci deviendra l'objet de wrapper correspondant à la valeur d'origine. Si la valeur de ce paramètre de valeur n'est pas définie ou nul, la valeur de celle-ci pointera vers l'objet global. En mode strict, la valeur de cette valeur est la valeur de ce paramètre de valeur, sans aucune conversion de type.
(2) interdit de traverser la pile d'appels à l'intérieur de la fonction
La copie de code est la suivante:
fonction f1 () {
"Utilisez strict";
F1.Caller; // signaler une erreur
f1.Arguments; // signaler une erreur
}
F1 ();
4. Désactiver la suppression des variables
Les variables ne peuvent pas être supprimées en mode strict. Seules les propriétés de l'objet dont la configuration est définie sur true peut être supprimée.
La copie de code est la suivante:
"Utilisez strict";
var x;
supprimer x; // Erreur de syntaxe
var o = object.create (null, 'x', {
Valeur: 1,
configurable: vrai
});
supprimer le bœuf; // Supprimer avec succès
5. Erreur explicite
En mode normal, si vous attribuez une propriété en lecture seule d'un objet, il n'y aura pas d'erreurs et il échouera silencieusement. En mode strict, une erreur sera signalée.
La copie de code est la suivante:
"Utilisez strict";
var o = {};
Object.defineProperty (o, "v", {value: 1, withing: false});
ov = 2; // signaler une erreur
En mode strict, si vous attribuez une propriété à lire à l'aide de la méthode Getter, une erreur sera signalée.
La copie de code est la suivante:
"Utilisez strict";
var o = {
get v () {return 1; }
};
ov = 2; // signaler une erreur
En mode strict, l'ajout de nouveaux attributs aux objets qui sont interdits d'être étendus entraîneront une erreur.
La copie de code est la suivante:
"Utilisez strict";
var o = {};
Object.preventextensions (o);
ov = 1; // signaler une erreur
En mode strict, la suppression d'une propriété Undetele provoquera une erreur.
La copie de code est la suivante:
"Utilisez strict";
supprimer objet.prototype; // signaler une erreur
6. Renommer l'erreur
Le mode strict a ajouté quelques erreurs de syntaxe.
(1) Les objets ne peuvent pas avoir d'attributs avec des noms en double
En mode normal, si l'objet a plusieurs attributs en double, le dernier attribut affecté remplacera la valeur précédente. En mode strict, il s'agit d'une erreur de syntaxe.
La copie de code est la suivante:
"Utilisez 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 avec des noms en double, il peut être lu avec des arguments [i]. En mode strict, il s'agit d'une erreur de syntaxe.
La copie de code est la suivante:
"Utilisez strict";
fonction f (a, a, b) {// Erreur de syntaxe
retour ;
}
7. La notation octale est interdite
En mode normal, si le premier bit d'un entier est 0, cela signifie qu'il s'agit d'un nombre octal, comme 0100 égal à 64 en décimal. Le mode strict interdit cette représentation. Si le premier bit de l'entier est de 0, une erreur sera signalée.
La copie de code est la suivante:
"Utilisez strict";
var n = 0100; // Erreur de syntaxe
8. Restrictions d'arguments objets
Les arguments sont des objets de paramètres des fonctions et le mode strict limite son utilisation.
(1) l'attribution d'arguments n'est pas autorisé
La copie de code est la suivante:
"Utilisez strict";
arguments ++; // Erreur de syntaxe
var obj = {set p (arguments) {}}; // Erreur de syntaxe
Essayez {} catch (arguments) {} // Erreur de syntaxe
Arguments de fonction () {} // Erreur de syntaxe
var f = nouvelle fonction ("arguments", "" utilise strict '; retour 17; "); // Erreur de syntaxe
(2) les arguments ne suivent plus les changements de paramètres
La copie de code est la suivante:
fonction f (a) {
a = 2;
return [a, arguments [0]];
}
f (1); // Le mode normal est [2,2]
fonction f (a) {
"Utilisez strict";
a = 2;
return [a, arguments [0]];
}
f (1); // mode strict est [2,1]
(3) l'utilisation des arguments.Callee est interdit
Cela signifie que vous ne pouvez pas vous appeler dans une fonction anonyme.
La copie de code est la suivante:
"Utilisez strict";
var f = function () {return arguments.callee; };
f (); // signaler une erreur
9. La fonction doit être déclarée au niveau supérieur
À l'avenir, les nouvelles versions de JavaScript introduiront la «portée au niveau du bloc». Pour s'aligner sur la nouvelle version, le mode strict permet uniquement de déclarer les fonctions au niveau supérieur de la portée ou de la portée globale de la portée. Autrement dit, il n'est pas autorisé à déclarer les fonctions dans les blocs de code non fonctionnel.
La copie de code est la suivante:
"Utilisez strict";
if (true) {
Fonction f () {} // Erreur de syntaxe
}
pour (var i = 0; i <5; i ++) {
fonction f2 () {} // Erreur de syntaxe
}
10. Gardez les mots
Afin de passer à une nouvelle version de JavaScript à l'avenir, certains mots réservés ont été ajoutés au mode strict: implémente, interface, let, package, privé, protégé, public, statique, rendement.
L'utilisation de ces mots comme noms de variables entraînera une erreur.
La copie de code est la suivante:
Package de fonction (protégé) {// Erreur de syntaxe
"Utilisez strict";
var instructions; // Erreur de syntaxe
}
De plus, la cinquième version d'ECMAScript stipule également d'autres mots réservés (classe, énumération, exportation, étend, importation, super), ainsi que les mots réservés constants ajoutés par les principaux navigateurs, qui ne peuvent pas être utilisés comme noms de variables.