Dans son obsession d'aligner les littéraux numériques, le développeur a par inadvertance initialisé une variable b
avec un littéral octal. Le mode non strict interprétera cela comme un littéral numérique avec valeur 24
(en base 10). Cependant, le mode strict générera une erreur.
Portée
Historiquement, JavaScript a été confus quant à la portée des fonctions. Parfois, ils semblent avoir une portée statique, mais certaines fonctionnalités les font se comporter comme s'ils avaient une portée dynamique. C'est déroutant, ce qui rend les programmes difficiles à lire et à comprendre. Un malentendu provoque des bugs. C'est également un problème de performances. La portée statique permettrait à la liaison de variables de se produire au moment de la compilation, mais l'exigence de portée dynamique signifie que la liaison doit être reportée à l'exécution, ce qui entraîne une pénalité de performance significative.
Le mode strict nécessite que toutes les liaisons de variables soient effectuées de manière statique. Cela signifie que les fonctionnalités qui nécessitaient auparavant une liaison dynamique doivent être supprimées ou modifiées. Plus précisément, l'instruction with est supprimée et la capacité de la fonction eval à altérer l'environnement de son appelant est sévèrement limitée.
Un des avantages du code strict est que des outils comme YUI Compressor
peuvent faire un meilleur travail lors de son traitement.
Variables globales implicites
JavaScript a impliqué des variables globales. Si vous ne déclarez pas explicitement une variable, une variable globale est implicitement déclarée pour vous. Cela facilite la programmation pour les débutants car ils peuvent négliger certaines de leurs tâches ménagères de base. Mais cela rend la gestion de programmes plus importants beaucoup plus difficile et dégrade considérablement la fiabilité. Ainsi, en mode strict, les variables globales implicites ne sont plus créées. Vous devez déclarer explicitement toutes vos variables.
Fuite mondiale
Il existe un certain nombre de situations qui pourraient entraîner this
la liaison à l'objet global. Par exemple, si vous oubliez de fournir le new
préfixe lors de l'appel d'une fonction constructeur, le constructeur this
sera lié de manière inattendue à l'objet global, donc au lieu d'initialiser un nouvel objet, il modifiera silencieusement les variables globales. Dans ces situations, le mode strict se liera this
à la place àundefined
, ce qui obligera le constructeur à lever une exception à la place, permettant à l'erreur d'être détectée beaucoup plus tôt.
Échec bruyant
JavaScript a toujours eu des propriétés en lecture seule, mais vous ne pouviez pas les créer vous-même avant l'ES5 Object.createProperty
fonction expose cette capacité. Si vous tentiez d'affecter une valeur à une propriété en lecture seule, elle échouerait silencieusement. L'affectation ne changerait pas la valeur de la propriété, mais votre programme se déroulerait comme s'il l'avait fait. Il s'agit d'un risque d'intégrité qui peut entraîner un état incohérent des programmes. En mode strict, la tentative de modification d'une propriété en lecture seule lèvera une exception.
Octal
La représentation octale (ou base 8) des nombres était extrêmement utile lors de la programmation au niveau machine sur des machines dont la taille des mots était un multiple de 3. Vous aviez besoin d'octal lorsque vous travailliez avec l'unité centrale CDC 6600, qui avait une taille de mot de 60 bits. Si vous pouviez lire l'octal, vous pourriez regarder un mot à 20 chiffres. Deux chiffres représentaient le code op et un chiffre identifiait l'un des 8 registres. Pendant la transition lente des codes machine vers les langages de haut niveau, il a été jugé utile de fournir des formes octales dans les langages de programmation.
En C, une représentation extrêmement malheureuse de l'octalité a été choisie: Zéro en tête. Donc en C, 0100
signifie 64, pas 100, et 08
c'est une erreur, pas 8. Encore plus malheureusement, cet anachronisme a été copié dans presque tous les langages modernes, y compris JavaScript, où il n'est utilisé que pour créer des erreurs. Cela n'a pas d'autre but. Donc en mode strict, les formes octales ne sont plus autorisées.
Etc
Le pseudo tableau d'arguments devient un peu plus semblable à un tableau dans ES5. En mode strict, il perd ses
propriétés callee
et caller
. Cela permet de passer votre arguments
code non fiable sans renoncer à beaucoup de contexte confidentiel. De plus, la
arguments
propriété des fonctions est supprimée.
En mode strict, les clés en double dans un littéral de fonction produiront une erreur de syntaxe. Une fonction ne peut pas avoir deux paramètres avec le même nom. Une fonction ne peut pas avoir de variable du même nom que l'un de ses paramètres. Une fonction ne peut pas avoir delete
ses propres variables. Une tentative vers
delete
une propriété non configurable lève désormais une exception. Les valeurs primitives ne sont pas implicitement encapsulées.
ECMAScript 5 ajoute une liste de mots réservés. Si vous les utilisez comme variables ou arguments, le mode strict générera une erreur. Les mots réservés sont: