Le modèle strict introduit dans ECMAScript5 permet aux développeurs d'avoir un "meilleur" langage JavaScript en permettant à l'environnement de fonctionnement JavaScript pour traiter certains des erreurs les plus courantes et les plus difficiles à détecter dans le processus de développement. Pendant longtemps, j'avais des doutes sur le mode strict car seul Firefox prend en charge le mode strict. Mais aujourd'hui, tous les navigateurs grand public prennent en charge le mode strict dans leurs dernières versions (y compris IE10, OPERA12 et Android 4, iOS5). Il est temps de commencer à utiliser le mode strict.
Quel rôle le modèle strict peut-il jouer?
Strict Pattern introduit beaucoup de changements à JavaScript, et je les ai divisés en deux catégories (évidents et subtils). L'objectif d'améliorations mineures est de résoudre certains problèmes détaillés dans JavaScript actuel, que je n'entrerai pas en profondeur ici; Si vous êtes intéressé, veuillez lire le merveilleux document écrit par Dmitry Soshnikov ECMA-262-5 en détail Chapitre 2 Mode strict. J'introduis principalement les changements évidents introduits par le mode strict, les concepts que vous devez connaître avant d'utiliser le mode strict et les changements qui vous aident le plus.
Avant de commencer à apprendre des fonctionnalités spécifiques, n'oubliez pas que l'un des principaux objectifs du mode strict est de vous permettre de déboguer plus rapidement et plus facilement. Il est préférable de lancer une erreur explicite lorsque l'environnement d'exécution découvre un problème que d'échouer silencieusement ou d'agir étrangement (ce qui est souvent le cas avec des environnements en cours d'exécution JavaScript qui ne s'allument pas sur le mode strict). Le mode strict lance plus d'erreurs, mais c'est une bonne chose car ces erreurs attireront votre attention et résoudront de nombreux problèmes potentiels qui étaient auparavant difficiles à repérer.
Supprimer avec des mots clés
Tout d'abord, l'instruction avec avec une instruction est supprimée en mode strict, et le code contenant l'instruction avec lancer une exception en mode strict. Ainsi, la première étape pour utiliser le mode strict: assurez-vous de ne pas utiliser dans votre code.
La copie de code est la suivante:
// Le code JavaScript suivant lancera une erreur en mode strict
avec (emplacement) {
alerte (href);
}
Empêcher d'attribuer des valeurs inattendues aux variables globales
Deuxièmement, les variables locales doivent être déclarées avant la cession. Avant que le mode strict ne soit activé, une variable globale avec le même nom est automatiquement créée lors de la copie pour une variable locale non déclarée. Il s'agit de l'une des erreurs les plus courantes dans les programmes JavaScript, et lorsque vous essayez de le faire en mode strict, des exceptions explicites seront lancées.
La copie de code est la suivante:
// L'exception sera lancée en mode strict
(fonction() {
SomeUndeclaredVar = "Foo";
} ());
Cet dans la fonction ne pointe plus le global par défaut
Un autre changement important en mode strict est que cette fonction qui n'est pas définie ou non définie (nul ou non définie) ne pointe pas par défaut vers l'environnement global. Cela entraînera certaines erreurs d'exécution de code qui dépendent du comportement par défaut de cela dans la fonction, par exemple:
La copie de code est la suivante:
window.color = "red";
Fonction saitColor () {
alerte (this.color);
}
// Une erreur sera signalée en mode strict. S'il n'est pas en mode strict, il incitera "rouge"
SayColor ();
// Une erreur sera signalée en mode strict. S'il n'est pas en mode strict, il incitera "rouge"
SayColor.Call (null);
Cela restera indéfini avant d'être affecté, ce qui signifie que lorsqu'un constructeur sera exécuté, une exception sera lancée s'il n'y a pas de nouveau mot clé clair auparavant.
La copie de code est la suivante:
fonction de fonction (nom) {
this.name = name;
}
// il y aura une erreur en mode strict
var me = personne ("Nicholas");
Dans le code ci-dessus, car il n'y a pas de nouveau auparavant, cela dans la fonction ne sera pas défini. Étant donné que vous ne pouvez pas définir des propriétés non définies, le code ci-dessus lancera une erreur. Dans les environnements de mode non stricts, cela n'est pas copié dans la variable globale de fenêtre par défaut, et le résultat de l'exécution sera de définir de façon inattendue l'attribut de nom pour la variable globale de la fenêtre.
Empêcher les renommés
Lorsque vous écrivez beaucoup de code, les propriétés d'objet et les paramètres de fonction sont facilement définis accidentellement sur un nom en double. Le mode strict lancera explicitement des erreurs dans ce cas
La copie de code est la suivante:
// Les noms de variables répétés rapporteront une erreur en mode strict
fonction dosomething (value1, valeur2, valeur1) {
//code
}
// Les noms d'attributs d'objets Dull rapporteront une erreur en mode strict:
var objet = {
foo: "bar",
foo: "baz"
};
Le code ci-dessus sera considéré comme une erreur de syntaxe en mode strict et vous permettra d'obtenir des invites avant l'exécution.
SAFE EVAL ()
Bien que l'instruction EVAL () n'ait pas été supprimée à la fin, elle a toujours été améliorée en mode strict. Le plus grand changement est que les variables et les déclarations de fonction exécutées dans EVAL () ne créeront pas directement des variables ou des fonctions correspondantes dans la portée actuelle, par exemple:
La copie de code est la suivante:
(fonction() {
eval ("var x = 10;");
// en mode non stricte, alerte 10
// En mode strict, une exception est lancée car x n'est pas définie.
alerte (x);
} ());
Toutes les variables ou fonctions créées lors de l'exécution de l'évaluation () sont conservées dans EVAL (). Mais vous pouvez explicitement obtenir le résultat de l'exécution dans eVAL () à partir de la valeur de retour de l'instruction EVAL (), par exemple:
La copie de code est la suivante:
(fonction() {
var result = eval ("var x = 10, y = 20; x + y");
// Les instructions restantes peuvent être exécutées correctement en mode strict ou non stricte. (Resulst a 30)
alerte (résultat);
} ());
Jetez une exception lors de la modification des attributs en lecture seule
Ecmascript5 introduit également la possibilité de définir des propriétés spécifiques d'un objet à en lecture seule, ou à rendre l'objet entier non modifié. Cependant, en mode non strict, essayer de modifier une propriété en lecture seule ne fera que l'échec silencieusement. Cela vous arrivera probablement lors de la gestion de certaines API natives du navigateur. Le mode strict lancera explicitement des exceptions dans ce cas, vous rappelant que la modification de cette propriété n'est pas autorisée.
La copie de code est la suivante:
var personne = {};
Object.defineproperty (personne, "nom" {
Écrivable: faux,
Valeur: "Nicholas"
});
// En mode non stricte, le silence échoue et une exception est lancée en mode strict.
personne.name = "John";
Dans l'exemple ci-dessus, l'attribut de nom est défini en lecture seule. La modification de l'exécution de l'attribut de nom en mode non stricte ne provoquera pas d'erreur, mais la modification ne réussira pas. Mais le mode strict lancera clairement des exceptions.
Remarque: il est fortement recommandé d'activer le mode strict lors de la spécification de l'utilisation des attributs ECMascript.
Comment l'utiliser?
Il est très facile d'activer le mode strict dans les navigateurs modernes, il suffit d'apparaître la commande suivante dans le code javascript
"Utilisez strict";
Bien que le code ci-dessus ne semble être qu'une chaîne qui ne donne pas une certaine variable, cela signifie en fait que le moteur JavaScript passe en mode strict (les navigateurs qui ne prennent pas en charge le mode strict ignoreront le code ci-dessus et n'auront aucun impact sur l'exécution ultérieure). Bien que vous puissiez appliquer cette instruction à une fonction globale ou à une fonction, nous devons ici vous rappeler de ne pas activer le mode strict dans un environnement mondial.
La copie de code est la suivante:
// s'il vous plaît ne l'utilisez pas comme ça
"Utilisez strict";
fonction dosomething () {
// Cette partie du code fonctionnera en mode strict
}
fonction dosomethingelse () {
// Cette partie du code fonctionnera également en mode strict
}
Bien que le code ci-dessus ne semble pas être un gros problème. Mais lorsque vous n'êtes pas responsable de maintenir tout le code introduit dans la page, l'utilisation de mode strict de cette manière vous fera des problèmes causés par le code tiers qui n'est pas préparé pour le mode strict.
Par conséquent, il est préférable d'utiliser des instructions qui permettent le mode strict dans la fonction, par exemple:
La copie de code est la suivante:
fonction dosomething () {
"Utilisez strict";
// Le code de cette fonction fonctionnera en mode strict
}
fonction dosomethingelse () {
// Le code de cette fonction ne fonctionnera pas en mode strict
}
Si vous souhaitez que le mode strict soit activé dans plusieurs fonctions, utilisez l'expression de fonction immédiatement invoquée (iife):
La copie de code est la suivante:
(fonction() {
"Utilisez strict";
fonction dosomething () {
// Cette fonction s'exécute en mode strict
}
fonction dosomethingelse () {
// Cette fonction s'exécute également en mode strict
}
} ());
en conclusion
Je vous recommande fortement d'activer le mode strict JavaScript à partir de maintenant, ce qui peut vous aider à découvrir des erreurs que vous n'avez pas remarquées dans votre code. Ne l'activez pas dans un environnement global, mais vous pouvez utiliser Iife autant que possible (exécuter immédiatement les expressions de fonction) pour appliquer des modèles stricts à plusieurs fonctions. Au début, vous rencontrerez des messages d'erreur que vous n'avez jamais rencontrés auparavant, ce qui est normal. Lorsque le mode strict est activé, assurez-vous de le tester dans les navigateurs pris en charge pour découvrir de nouveaux problèmes potentiels. N'ajoutez pas seulement une ligne "Utilisez strict" au code et supposons que le code restant fonctionnera correctement. Enfin, commencez à écrire un meilleur code en mode strict.
Note:
Voici un résumé des situations de support en mode strict de chaque navigateur.
Vous pouvez tester la prise en charge du mode strict du navigateur actuel sur cette page.
Avantages du mode strict:
Rendre JavaScript plus fort
1. Ce n'est plus encapsulé et en mode normal, cela a toujours été un objet.
2. Fun.Caller et Fun.Arguments ne sont pas des propriétés de suppression et ne peuvent pas être définies ou récupérées.
3. Arguments.Caller est également un attribut qui ne peut pas être supprimé, et il ne peut pas être réglé ou récupéré.
Ouvrir la voie aux futures versions Ecmascript
1. Les mots réservés suivants ont été ajoutés: outils, interface, let, package, privé, protégé, public, statique et rendement.
2. La déclaration de la méthode doit être placée à l'avant du script ou de la méthode, et ne peut pas être placée au milieu des instructions telles que si ou pour.