Le mode strict en JavaScript

Les langages informatiques sont des langages qui évoluent vite et de nouvelles fonctionnalités sont régulièrement ajoutées tandis que d’autres parties du langage, plus anciennes, peuvent être modifiées ou déclarées obsolètes.

Pendant longtemps, les créateurs du JavaScript n’ont fait qu’ajouter de nouvelles fonctionnalités sans jamais toucher les anciennes. L’avantage principal de cela a été que les développeurs pouvaient utiliser l’ensemble du langage sans se soucier de problème de comptabilité.

Cependant, la contrepartie était qu’on avait un langage moins flexible et avec d’anciennes fonctionnalités qui ne faisaient plus beaucoup de sens dans un contexte actuel. Ainsi, à la fin des années 2000, certaines fonctionnalités du langage ont commencé à être modifiées, notamment en termes de la gestion des erreurs.

Afin que les sites possédant d’anciens codes JavaScript (des codes JavaScript implémentant les fonctionnalités modifiées avant modification) restent fonctionnels, la plupart des modifications apportées au langage ont été désactivées par défaut. Pour activer ces modifications et utiliser ces nouvelles fonctionnalités du JavaScript, nous allons devoir utiliser la directive use strict.

 

Présentation et définition du mode strict

Le mode strict de JavaScript est, comme son nom l’indique, un mode qui va contenir une sémantique légèrement différente et plus stricte par rapport au JavaScript « classique ».

Le mode strict va notamment lever plus d’erreurs que le JavaScript classique. En effet, le JavaScript classique laisse passer de nombreuses erreurs de syntaxes sans lever d’erreurs de manière explicite (on parle d’erreurs silencieuses). Avec le mode strict, certaines erreurs silencieuses vont être transformées en erreurs explicites qu’on va devoir gérer.

Par exemple, si vous déclarez une variable sans préciser le mot clef let (ou var) en JavaScript « classique », la variable déclarée va devenir globale et aucune erreur ne sera déclenchée.

Cependant, cela est à minima considéré comme une mauvaise pratique et devrait en fait être une erreur.

Avec le mode strict, cela ne sera pas permis : si vous omettez let (ou var) dans la déclaration d’une variable, une erreur va être lancée et le script ne s’exécutera pas.

De plus, le mode strict interdit l’usage de certains mots que le JavaScript pourrait utiliser comme mots clefs dans ses versions futures.

Le mode strict permet finalement une exécution plus rapide du code en forçant une meilleure implémentation de certaines méthodes et propriétés connues pour avoir des comportements parfois imprévisibles.

Le mode strict va donc être utilisé pour créer des scripts plus clairs et syntaxiquement exacts ce qui est toujours une bonne chose. D’un point de vue personnel, je vous recommande dorénavant de toujours écrire vos scripts en mode strict.

 

Activer et utiliser le mode strict

Pour activer le mode strict, nous allons utiliser la syntaxe use strict. On va pouvoir choisir d’activer le mode strict pour un script entier ou seulement pour certaines fonctions choisies.

Pour activer le mode strict dans tout le script, il faudra ajouter l’instruction use strict au tout début de celui-ci.

Utilisation du mode strict en JavaScript

Pour activer le mode strict dans une fonction uniquement, on ajoutera use strict dans le code de notre fonction, au tout début également.

Utilisation du mode strict dans une fonction en JavaScript

Attention : si l’instruction use strict n’est pas la première dans le script ou dans une fonction, alors le mode strict ne fonctionnera pas.

Notez par ailleurs que le contenu des modules JavaScript (une des fonctionnalités récentes du JavaScript que nous étudierons dans la partie suivante) est automatiquement en mode strict.

 

Les différences entre le mode strict et le JavaScript classique en détail

Regardons plus en détail les grandes différences entre un script en mode strict et un script JavaScript classique.

Déclarer une variable sans let ou var

En JavaScript classique, si on omet le mot clef let (ou var) lors de la déclaration d’une variable et de l’affectation d’une valeur à celle-ci, aucune erreur n’est levée. Le JavaScript va ici en effet créer une nouvelle propriété sur l’objet global (window dans le cas d’une page visible dans un navigateur) et donc créer une variable globale.

En mode strict, cela est interdit : si on omet let ou var, une erreur sera levée et aucune variable globale ne sera créée.

Affecter une valeur à une variable ou une propriété non accessible en écriture

De même, le JavaScript ne lève pas d’erreur explicite dans le cas où on tente d’affecter une valeur à une variable (ou à une propriété) qui ne serait pas accessible en écriture mais va simplement ignorer la valeur qu’on tente d’affecter à la variable ou propriété.

En mode strict, si on tente d’affecter une valeur à une variable non accessible en écriture, une erreur est levée.

Tenter de supprimer une propriété non supprimable

En JavaScript classique, lorsqu’on tente de supprimer une propriété non supprimable, comme la propriété prototype d’un objet par exemple, rien ne se passe. En mode strict, une erreur est levée.

Déclarer plusieurs paramètres de même nom dans une fonction

En mode non strict, si une fonction possède plusieurs paramètres de même nom, seul le dernier argument passé à la place des paramètres de même nom sera considéré par le JavaScript.

En mode strict, si une fonction possède plusieurs paramètres de même nom, une erreur est levée.

Utiliser des notations octales

Lorsqu’on fait précéder un nombre par un 0 en JavaScript, la plupart des navigateurs interprètent le nombre comme s’il était écrit en notation octale.

Ce comportement est généralement non souhaitable et donc le mode strict lèvera une erreur si on tente de mentionner un 0 au début d’un nombre.

Définir des propriétés sur des valeurs primitives

Si on tente de définir des propriétés sur des valeurs primitives, les définitions seront simplement ignorées en JavaScript classique. En mode strict, cela lèvera une erreur.

Utiliser with et eval()

Le mode strict interdit l’utilisation de l’instruction with que nous n’étudierons pas dans ce cours car son utilisation pose de nombreux problèmes.

De plus, en mode strict, la méthode eval() n’est pas autorisée à créer des variables dépassant sa propre portée.

Nous ne parlerons pas non plus de eval() dans ce cours car c’est une méthode dont on déconseille généralement l’utilisation et à plus fort titre pour des développeurs non expérimentés.

Utiliser this et arguments

En JavaScript classique, this est toujours un objet pour n’importe quelle fonction ou méthode. En effet, si la valeur fournie pour this est une valeur primitive, alors elle sera convertie en objet. Si this vaut null ou undefined, alors ce sera l’objet global qui sera passé à la fonction.

Cette conversion automatique, en plus d’impacter négativement les performances peut exposer l’objet global et cela est non souhaité et peut mener à diverses failles de sécurité dans le code

La valeur de this en mode strict n’est donc pas transformée en objet et si elle n’est pas définie la valeur passée sera undefined.

La propriété arguments, quant-à-elle, ne permet pas d’accéder aux variables passées à la fonction lors de son appel en mode strict. Cela permet également de réduire les failles de sécurité.

Le mode strict et les noms réservés

Finalement, en mode strict, il est interdit d’utiliser les termes implements, interface, let, package, private, protected, public, static, et yield pour nommer des variables ou des arguments car ce sont des mots réservés.

En effet, ces mots pourraient être utilisés comme mots clefs dans les versions futures de JavaScript et il est donc préférable de ne pas les utiliser pour éviter tout problème futur.

Laisser un commentaire