2010-02-26 6 views
39

Quelle est la portée du pragma de mode strict dans ECMAScript5?Dans ECMAScript5, quelle est la portée de "use strict"?

"use strict"; 

Je voudrais le faire (surtout parce que JSLint ne se plaint pas à ce sujet):

"use strict"; 

(function() { 
    // my stuff here... 
}()); 

Mais je ne suis pas sûr si cela briserait tout autre code ou non. Je sais que je peux le faire, qui sera portée pragma à la fonction ...

(function() { 

    "use strict"; 

    // my stuff here... 

}()); 

mais JSLint se plaint à ce sujet (lorsque l'option JSLint « stricte » est activé), car il pense que vous l'exécution de code avant d'activer "use strict".

Voilà ma question. Si je fileA.js:

"use strict"; 
// do some stuff 

et fileB.js:

eval(somecodesnippet); // disallowed by "use strict" 

puis les inclure dans ma page html dans ce même ordre, sera la pragma être scope au fichier, ou le sera le pragma saigne dans le fichier B, bloquant ainsi l'exécution d'eval?

+0

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 –

+0

'eval()' est autorisé avec '' use strict '', il a juste une portée globale. –

Répondre

2

EDIT Il semble que je me trompais. S'il vous plaît voir Jeff Walden's answer below.

Découvrez cette réponse à une question connexe: What does "use strict" do in JavaScript, and what is the reasoning behind it?

Malgré les plaintes de JSLint, vous pouvez (et devrait) utiliser "use strict"; à l'intérieur d'une fonction si vous ne souhaitez que cette fonction soit en mode strict. Si vous l'utilisez dans le contexte global, cela forcera tout votre code à être en mode strict. Réponse courte: oui, il va bloquer votre utilisation de eval.

+2

Cette réponse est incorrecte. L'utilisation de la directive en haut de 'fileA.js' fait que l'intégralité de ce fichier est en mode strict, mais cela ne fait pas que' fileB.js' soit en mode strict, quel que soit l'ordre dans lequel ils sont inclus dans la page HTML . De plus, 'eval()' fonctionne différemment en mode strict, mais cela fonctionne toujours. Ce n'est pas "bloqué". –

54

"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.)

+4

'Strictness ne "saigne" absolument pas - Ce n'est pas tout à fait correct. Vous ne pouvez pas utiliser '.caller' dans un code non strict lorsque la fonction sur laquelle vous l'utilisiez a été définie en mode strict. Donc le code non strict peut en fait se casser parce que d'autres codes sont en mode strict - je considérerais ce saignement. – AndreKR

+1

De la façon dont la question originale a été formulée, j'interpréterais «saigner» comme signifiant dans le sens du code source lexical et textuel - du script B reprenant la rigueur du script A, sans B optant pour la rigueur elle-même. De toute évidence, les effets d'un script (y compris ceux causés par la rigueur) sont visibles - "purger", pourrait-on dire - dans d'autres scripts.La * nature * de l'effet peut différer en fonction de la rigueur du script déclencheur. Mais strict ou non, les effets d'un script sont visibles dans l'autre. Cela ne me semble pas une définition particulièrement utile de «saigner». –

0
eval(somecodesnippet); // disallowed by "use strict" 

Non si vous déclarez somecodesnippet avant.

var somecodesnippet = "votre génial codesnippet ici";

eval (somecodesnippet); // ne sont pas désavouées par "use strict"

0

Le fichier entier:

<script...> 
    "use strict"; 

ou

La fonction entière et ses fonctions embeded par exemple:

function fn(){ 
    "use strict"; 
+0

Il existe déjà une réponse acceptée, qui résout le problème OP. Le vôtre n'ajoute plus de qualité. –

Questions connexes