"use strict"
gilt nur für Funktion oder Programmbereich. Wenn Sie also fileA.js mit "use strict"
an der Spitze haben, wird fileA.js im strikten Modus ausgeführt, und alle darin definierten Funktionen machen dasselbe, wenn sie aufgerufen werden. Aber dateiB.js ist ein separates Programm, so dass die Datei "use strict"
von fileA.js nicht darauf zutrifft - und daher fileB.js im nicht strikten Modus ausgeführt wird. (Natürlich, wenn somecodesnippet
mit einer "use strict"
Direktive beginnt und richtig analysiert, wird dieser Code im strikten Modus ausgeführt, und Funktionen, die durch diesen Code definiert werden, werden ebenfalls ausgeführt.) Strenge absolut nicht "bluten" - und pro ES5 4.2.2 (zugegebenermaßen nicht normativ, aber ich bin mir sicher, dass ich bei Bedarf eine normative Referenz dafür ausgraben könnte), "eine Implementierung muss die Kombination von uneingeschränkten und strikten Modus-Code-Einheiten zu einem einzigen zusammengesetzten Programm unterstützen".
Ein Problem: Wenn Sie den strikten Modus im globalen Bereich manchmal, aber nicht immer verwenden, können Sie Ihre Skripte nicht mehr in einer einzigen Datei verketten. Angenommen, Sie haben die Skripte A, B, C, D in dieser Reihenfolge. Wenn A streng ist, wird die Gesamtverkettung streng sein, selbst wenn B/C/D nicht wäre! Umgekehrt, wenn A nicht streng ist (und nicht leer ist), wird die Gesamtverkettung nicht streng sein, selbst wenn B/C/D streng sind. Dies hat bereits mindestens eine Early-Adopter-Site gebissen.
Alles, was gesagt, strikt Modus verbietet nicht eval
.Wenn eval
der normale Weg im strikten Modus aufgerufen wird, mit der Programmsyntax der Form eval(code [, ...])
, ist es ein "direktes" Eval, das sich so verhält eval
hat immer - außer dass code
immer als strict mode code ausgewertet wird, auch wenn code
doesn ' t Beginnen Sie mit einer "use strict"
Direktive, mit der Ausnahme, dass alle Variablen, die durch den Code erzeugt werden, in einem separaten Speicher von allen vorhandenen Variablen gespeichert werden. (Die genaue Semantik ist ein bisschen kompliziert; ich arbeite an der JavaScript-Engine von Firefox, in letzter Zeit implementiere ich diese Sachen, und selbst nach einiger Zeit in der Spezifikation und an einer Implementierung arbeite ich immer noch nicht intuitiv.)
Wenn es nicht so heißt - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
, und so weiter - es ist eine "indirekte" Eval. Indirekt eval (ob innerhalb oder außerhalb des strikten Modus) verhält sich ein wenig anders: Namensauflösung und Variablendefinition treten auf, als ob sie sich im globalen Gültigkeitsbereich befinden. (Der Code wird ausgeführt, wie Strict-Modus-Code nur dann, wenn sie mit einer "use strict"
Richtlinie beginnt.)
Strict-Modus-Unterstützung ist fast - aber nicht vollständig - fertig in der neuesten Firefox nightlies, so es kann sich lohnen, ein Download zu spielen herum mit den Teilen des strikten Modus, die implementiert sind. Ich würde immer noch sagen, warten Sie auf die Verwendung der Produktion, bis es abgeschlossen ist, aber es ist definitiv bereit für Experimente (solange Sie verstehen, strengen Modus ist noch nicht vollständig). (Was Sean McMillans Link anbelangt, seien Sie sich bewusst, dass seine Behauptungen von "Support" das für jede Kugel erforderliche Minimum an Funktionalität darstellen. Die Strict-Mode-Tests sind viel besser, obwohl sie nicht annähernd den strikten Modus vollständig abdecken.)
A-Seite Anmerkung: Douglad Crockfords Präsentation über "Der Zustand und die Zukunft von Javascript war wirklich großartig. Er diskutiert einige der neuen Funktionen wie streng am Ende des Vortrags. Hier ist der Link: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –
'eval()' ist erlaubt mit '" use strict "', es wird nur globale Reichweite. –