Le mode strict est une nouvelle fonctionnalité d'Ecmascript 5. Il vous permet de placer l'ensemble du programme, ou une fonction, dans un contexte de fonctionnement "strict". Ce contexte strict empêche certaines opérations et lance plus d'exceptions.
Alors que Ecmascript 5 est en arrière compatible avec ECMascript 3, en mode strict, toutes les fonctionnalités qui ne sont pas privilégiées dans ECMAScript 3 sont désactivées (ou ont lancé une erreur) plutôt que compatible.
Activer le mode strict a les avantages suivants:
1. Catchez quelques erreurs de programmation et lancez des exceptions.
2. Empêcher certaines opérations relativement "dangereuses" (comme l'accès aux variables globales) et les exceptions sont lancées.
3. Désactiver certaines fonctionnalités déroutantes.
La plupart des informations sur le mode strict peuvent être trouvées à la page 223 du code ES5 [PDF].
(Remarque: le mode strict d'Ecmascript 5 est différent du mode strict de Firefox)
Comment activer le mode strict
Ajoutez cette instruction au début du programme pour activer le mode strict pour l'ensemble du script:
La copie de code est la suivante:
«utiliser strict»;
Vous pouvez également activer le mode strict uniquement à l'intérieur de la fonction, afin qu'il n'affecte pas l'extérieur:
La copie de code est la suivante:
fonction imstrict () {
«utiliser strict»;
// ... votre code ...
}
Une instruction qui permet un mode strict n'est qu'une chaîne normale "utilise stricte", sans aucune nouvelle syntaxe. Cela signifie qu'il n'y aura pas d'impact négatif sur l'ancien navigateur.
Une application pratique de l'activation du mode strict à l'intérieur d'une fonction consiste à définir l'intégralité de la bibliothèque de classe JavaScript à l'intérieur d'une fonction de mode stricte, de sorte qu'elle n'affecte pas le code externe:
La copie de code est la suivante:
// Code non stricte ...
(fonction(){
"Utilisez strict";
// Définissez strictement votre bibliothèque ...
}) ();
// Code non stricte ...
Alors, quelles modifications ont été apportées dans les scripts en mode strict?
Variables et propriétés
L'attribution d'une variable non définie échouera au lieu d'utiliser cette variable comme variable globale.
La rédaction d'une propriété avec une propriété écrivative est fausse, supprimant une propriété avec une propriété configurable avec un faux, ou l'ajout d'une propriété avec une propriété extensible avec un faux, entraînera une erreur (ces caractéristiques sont pré-agressées). Dans le passé, ces opérations n'ont pas lancé des exceptions, mais ont simplement échoué silencieusement.
La réalisation d'opérations de suppression sur les variables, les fonctions ou les paramètres de fonction entraînera une erreur.
La copie de code est la suivante:
var foo = 'test';
Fonction Test () {}
supprimer foo; // Erreur
supprimer le test; // Erreur
fonction test2 (arg) {
supprimer arg; // Erreur
}
La définition de la même propriété à l'intérieur d'un conteneur d'objet entraînera la lancement de l'exception:
La copie de code est la suivante:
// Erreur
{foo: true, foo: false}
évaluer
Toute utilisation du nom "EVAL" (l'objectif principal est de pointer la fonction EVAL sur une variable ou une propriété d'un objet) est interdite.
La copie de code est la suivante:
// tous génèrent des erreurs ...
obj.eval = ...
obj.foo = eval;
var eval = ...;
pour (var eval dans ...) {}
fonction eval () {}
Test de fonction (EVAL) {}
fonction (ev) {}
Nouvelle fonction ("ev")
De plus, la déclaration de nouvelles variables via EVAL sera également invalide:
La copie de code est la suivante:
eval ("var a = false;");
imprimer (type de a); // indéfini
fonction
Réécriture des arguments objet provoquera une erreur:
La copie de code est la suivante:
arguments = [...]; // pas autorisé
Les paramètres avec le même nom entraîneront une erreur:
La copie de code est la suivante:
(fonction (foo, foo) {}) // erreur
Accès aux arguments.Caller et Arguments.Callee lance une exception. Par conséquent, toute fonction anonyme qui doit être utilisée doit être nommée en premier, par exemple:
La copie de code est la suivante:
setTimeout (fonction ultérieurement () {
// faire des trucs ...
setTimeout (plus tard, 1000);
}, 1000);
Les arguments, les propriétés de l'appelant et de la callee de la fonction n'existent plus, et l'opération pour les définir est également interdite.
La copie de code est la suivante:
Fonction Test () {}
Test.Caller = 'appelant'; // Erreur
Enfin, un bug de longue date (et très ennuyeux) a été résolu: lorsque Null ou Undefined est utilisé comme premier paramètre de la Fonction.prototype.Call ou Function.prototype.Apply Méthode, cette fonction pointera vers l'objet global. Et le mode strict empêchera ses exceptions d'exécution et de lancement:
La copie de code est la suivante:
(function () {...}). call (null); // Exception
avec() { }
L'instruction With () {} s'accroche complètement en mode strict.