"use strict"
applique uniquement à la fonction ou la portée du programme. Donc, si vous avez fileA.js avec "use strict"
en haut, fileA.js en mode strict exécute, et toutes les fonctions qui y sont définies fera de même lorsqu'il est appelé. Mais fileB.js est un programme distinct, de sorte que le "use strict"
de fileA.js ne lui sont pas applicables - et donc fileB.js exécutera en mode non-stricte. (Bien sûr, si somecodesnippet
commence par une directive "use strict"
et analyse correctement, ce code s'exécutera en mode strict, et les fonctions définies par ce code feront de même.) La rigueur ne "saigne" absolument pas - et par ES5 4.2.2 (certes non-normatif, mais je suis sûr que je pourrais trouver une référence normative pour cela si nécessaire), "une implémentation doit supporter la combinaison d'unités de code de mode non restreintes et strictes dans un seul programme composite". On obtient ceci: si vous utilisez le mode strict dans la portée globale, parfois mais pas toujours, vous ne pouvez plus concaténer vos scripts en un seul fichier. Supposons que vous ayez les scripts A, B, C, D dans cet ordre. Si A est strict, la concaténation globale sera stricte, même si B/C/D ne l'était pas! Inversement, si A n'est pas strict (et n'est pas vide), la concaténation globale sera non-stricte, même si B/C/D était strict. Cela a déjà mordu au moins un site d'adoption précoce là-bas.
Tout cela dit, le mode strict n'interdit pas eval
.Lorsque eval
est appelé la manière normale en mode strict, en utilisant la syntaxe du programme de la forme eval(code [, ...])
, c'est un eval "direct" qui se comporte comme eval
a toujours - sauf que code
est toujours évalué comme code de mode strict, même si code
doesn ' t commencer par une directive "use strict"
, et sauf que toutes les variables créées par le code sont conservées dans leur propre stockage séparé des variables existantes. (La sémantique exacte est un peu compliquée, je travaille sur le moteur JavaScript de Firefox, et après une bonne partie de la spécification et du travail sur une implémentation, ce n'est toujours pas intuitif.)
Si ce n'est pas appelé de cette façon - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
, et ainsi de suite - c'est un eval "indirect". L'évaluation indirecte (à l'intérieur ou à l'extérieur du mode strict) se comporte un peu différemment: la résolution du nom et la définition de la variable se produisent comme dans la portée globale. (Le code exécutera code de mode strict que si elle commence par une directive "use strict"
.)
support mode strict est presque - mais pas complètement - fini dans le dernier Firefox nightlies, il peut être utile de télécharger un à jouer autour avec les parties du mode strict qui sont mis en œuvre. Je dirais quand même de ne pas utiliser la production jusqu'à ce qu'elle soit complète, mais elle est définitivement prête pour l'expérimentation (à condition que vous compreniez que le mode strict n'est pas encore complètement utilisé). (Quant au lien de Sean McMillan, sachez que ses prétentions de «support» représentent le minimum de fonctionnalité nécessaire pour chaque balle.Les tests de mode strict sont bien meilleurs, bien qu'ils soient loin de couvrir complètement le mode strict.)
A côté note: la présentation de Douglad Crockford sur «L'état et l'avenir de Javascript» était vraiment géniale. strict à la fin de la conversation. Voici le lien: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –
'eval()' est autorisé avec '' use strict '', il a juste une portée globale. –