"use strict"
si applica solo alla funzione o all'ambito del programma. Quindi se hai fileA.js con "use strict"
nella parte superiore, fileA.js viene eseguito in modalità rigorosa e tutte le funzioni definite in esso eseguiranno lo stesso quando vengono chiamate. Ma fileB.js è un programma separato, quindi lo "use strict"
da fileA.js non si applica ad esso - e quindi fileB.js verrà eseguito in modalità non rigida. (Naturalmente, se somecodesnippet
inizia con una direttiva "use strict"
e analizza correttamente, quel codice verrà eseguito in modalità rigorosa e le funzioni definite da quel codice funzioneranno allo stesso modo.) La rigidità non è assolutamente "sanguinante" - e per ES5 4.2.2 (dichiaratamente non-normativo, ma sono sicuro di poter ricavare un riferimento normativo per questo, se necessario), "un'implementazione deve supportare la combinazione di unità di codice modalità illimitate e rigorose in un singolo programma composito".
Un getchack di questo: se si utilizza la modalità rigorosa nell'ambito globale a volte ma non sempre, non è più possibile concatenare gli script in un singolo file. Supponiamo di avere gli script A, B, C, D in questo ordine. Se A è severo, la concatenazione generale sarà rigorosa, anche se B/C/D non lo fosse! Viceversa, se A non è severo (e non è vuoto), la concatenazione generale sarà non rigida, anche se B/C/D sono rigidi. Questo ha già morso almeno un sito di early-adopter là fuori.
Detto questo, la modalità rigorosa non proibisce eval
.Quando eval
viene chiamato nella modalità normale in modalità rigorosa, utilizzando la sintassi del programma eval(code [, ...])
, si tratta di un'evid "diretta" che si comporta nel modo in cui ha sempre eval
- ad eccezione del fatto che code
viene sempre valutato come codice a modalità rigorosa, anche se code
non funziona t iniziare con una direttiva "use strict"
e ad eccezione del fatto che qualsiasi variabile creata dal codice viene mantenuta nella propria memoria separata da qualsiasi variabile esistente. (La semantica esatta è un po 'complicata, lavoro sul motore JavaScript di Firefox, di recente implementare questa roba, e anche dopo una discreta quantità di tempo nello spec e lavorando su un'implementazione non è ancora intuitivo.)
Se non viene chiamato in questo modo: eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
e così via, è una valutazione "indiretta". La valutazione indiretta (sia all'interno che all'esterno della modalità rigorosa) si comporta in modo leggermente diverso: la risoluzione dei nomi e la definizione delle variabili si verificano come se fossero nell'ambito globale. (Il codice verrà eseguito come codice della modalità rigorosa solo se inizia con una direttiva "use strict"
.)
Il supporto della modalità rigorosa è quasi - ma non completamente completato nell'ultimo Firefox nightlies, quindi potrebbe valerne la pena scaricarne uno per giocare in giro con quelle parti della modalità rigorosa che vengono implementate. Continuo a dire di tenere a bada l'uso della produzione fino a quando non è completo, ma è sicuramente pronto per la sperimentazione (a patto che tu capisca che la modalità rigorosa non è ancora completamente inserita). (Per quanto riguarda il collegamento di Sean McMillan, sappi che le sue affermazioni di "supporto" rappresentano l'estremo minimo di funzionalità necessario per ciascun proiettile. I test in modalità rigorosa sono molto migliori, anche se per essere sicuri che non sono affatto vicini a coprire completamente la modalità rigorosa.)
lato A nota: la presentazione di Douglad Crockford su "Lo stato e il futuro di Javascript è stata davvero eccezionale. Discute alcune delle nuove funzionalità come rigoroso alla fine del discorso. Ecco il link: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –
'eval()' è permesso con '" use strict "', viene appena applicato a livello globale. –