"use strict"
относится только к области функций или программ. Поэтому, если у вас есть файл File.js с "use strict"
вверху, файлA.js выполняется в строгом режиме, и все функции, определенные в нем, будут делать то же самое при вызове. Но fileB.js - отдельная программа, поэтому "use strict"
от fileA.js к ней не применяется - и поэтому файлB.js будет выполняться в нестрогом режиме. (Конечно, если somecodesnippet
начинается с директивы "use strict"
и правильно анализирует, этот код будет выполняться в строгом режиме, а функции, определенные этим кодом, будут действовать аналогично.) Строгость абсолютно не «истекает» - и по ES5 4.2.2 (по общему признанию, ненормативный, но я уверен, что в случае необходимости я смогу выработать нормативную ссылку для этого), «реализация должна поддерживать комбинацию неограниченных и строгих модулей кода режима в единую составную программу».
Один из них: если вы используете строгий режим в глобальном масштабе иногда, но не всегда, вы больше не можете конкатенировать свои сценарии в один файл. Предположим, что у вас есть сценарии A, B, C, D в этом порядке. Если A строгое, общая конкатенация будет строгой, даже если B/C/D не будет! И наоборот, если A не является строгим (и непустым), общая конкатенация будет нестрогой, даже если B/C/D были строгими. Это уже укусило, по крайней мере, один ранний сайт.
Все, что сказано, строгий режим не запрещает eval
.Когда eval
называется обычным способом в строгом режиме, используя программный синтаксис формы eval(code [, ...])
, это «прямой» eval, который ведет себя так, как всегда eval
- за исключением того, что code
всегда оценивается как строгий код режима, даже если code
doesn ' t начинать с директивы "use strict"
, за исключением того, что любые переменные, созданные кодом, хранятся в отдельном хранилище от любых существующих переменных. (Точная семантика немного сложна, я работаю над движком JavaScript Firefox, но в последнее время это реализовано, и даже после довольно много времени в спецификации и работы над реализацией она все еще не интуитивно понятна мне.)
Если это так не называется - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
и т. Д. - это «косвенная» оценка. Косвенная оценка (как внутри, так и снаружи строгого режима) ведет себя несколько иначе: разрешение имен и определение переменной происходят, как в глобальной области. (Код будет выполняться как строгий код режима, только если он начинается с "use strict"
директивы.)
Строгий режим поддержки почти - но не полностью - законченный в последнем Firefox nightlies, так что может быть стоит загрузить один играть вокруг с теми частями строгого режима, которые реализованы. Я бы все же сказал, что держится на производстве, пока это не будет полным, но он определенно готов к экспериментированию (пока вы понимаете, что строгий режим еще не полностью включен). (Что касается ссылки Шона Макмиллана, имейте в виду, что его претензии на «поддержку» представляют собой минимальный минимум функциональности, необходимый для каждой пули. Тесты строгого режима намного лучше, хотя они точно не подходят для полного ограничения строгого режима.)
Побочным примечание: презентация Дуглада Крокфорда «Состояние и будущее Javascript была действительно велика». Он обсуждает некоторые новые функции, такие как строго в конце разговора. Вот ссылка: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –
'eval()' разрешено с '' use strict '', оно просто распространяется во всем мире. –