JavaScript : Coder en mode strict

JavaScript est un langage permissif. En effet, certaines pratiques qui entraîneraient des erreurs dans d’autres langages sont permises en JavaScript comme :

  • ne pas mettre de ; en fin de ligne
  • la non déclaration d’une variable avant une affectation
  • la fonction eval qui permet d’interpréter du code générer à la volée (avec le célèbre « eval is evil »)

Ces fonctionnalités peuvent être pratique mais sont souvent source d’erreur.

La norme EcmaScript (langage dont JavaScript est une implémentation) 5 a introduit ce qu’on appelle le mode strict qui permet de générer une erreur dans un certains nombre de cas afin d’avoir un code plus propre, maintenable tout en étant compatible avec les versions précédentes d’EcmaScript (il est toujours possible de ne pas mettre de ; en fin de ligne).

Activation du mode Strict

"use strict";
//Mon code en mode strict

Avec un closure pour être plus propre :

(function() {
  "use strict";
  //Mon code en mode strict
  var x = 0;
  var maFunction() { ... }
})();

La portée du mode strict dépend du contexte. S’il est déclaré dans un contexte global (hors de la portée d’une fonction), tout le code du programme est en mode strict. S’il est déclaré dans une fonction, tout le code de la fonction est en mode strict.

Exemple

Voici un exemple de 2 div dont le contenu est modifié par du code JavaScript, un en mode strict et l’autre non. Dans les 2 codes, il manque le mot clé var devant la déclaration de la div (div1 ou div2).

<div id="div1">Ce contenu n'est pas modifié car le code n'est pas valide "strict mode"</div>
<div id="div2">Ce contenu est modifié car le code n'est pas en "strict mode"</div>

<script>
//Avec Mode Strict
(function() {
	"use strict";
	div1 = document.getElementById('div1');
	div1.innerHTML = 'Test mode stict';	
})();
</script>

<script>
//Sans Mode Strict
(function() {
	div2 = document.getElementById('div2');
	div2.innerHTML = 'Test mode stict';	
})();
</script>

On peut ainsi voir que le code en mode strict génère une erreur « Uncaught ReferenceError: div1 is not defined »(ci-dessous dans la console de Chrome). Sous firefox, l’erreur est « ReferenceError: assignment to undeclared variable div1 ». Le code sans mode strict s’est lui bien exécuté.

Affichage d'une erreur dans le débuggeur Chrome

Restriction du mode strict

Je vous renvoie vers la page MSDN sur le mode strict qui référence les principales restrictions de ce mode.

Liens

Les outils de validation comme JSLint (dont j’ai parlé précédemment) ou JSHint (fork de JSLint) contiennent une règle permettant de vérifier l’activation de ce mode (cette règle est désactivable) ainsi que les règles associées à ce mode strict.

Conclusion

L’utilisation du mode strict est un moyen de d’améliorer la qualité de son code afin de le rendre plus maintenable et évolutif. Il est à noter que IE ne gère ce mode que depuis la version 10.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *