"use strict"
применяется только к области функций или программ. Таким образом, если у вас есть fileA.js с "use strict"
вверху, fileA.js выполняется в строгом режиме, и все функции, определенные в нем, будут делать то же самое при вызове. Но fileB.js - это отдельная программа, поэтому "use strict"
из fileA.js к нему не относится - и, следовательно, fileB.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
не начинается с директивы "use strict"
, за исключением того, что любые переменные, созданные кодом, хранятся в отдельном хранилище от любых существующих переменных. (Точная семантика немного сложна; я работаю над движком JavaScript Firefox, в последнее время реализую этот материал, и даже после большого количества времени в спецификации и над реализацией он все еще не интуитивен для меня.)
Если это так не называется - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
и т. Д. - это «косвенный» eval. Косвенный eval (внутри или вне строгого режима) ведет себя немного по-другому: разрешение имен и определение переменных происходят как бы в глобальной области видимости. (Код будет выполняться как код строгого режима, только если он начинается с директивы "use strict"
.)
Поддержка строгого режима почти - но не полностью - завершена в последних ночных Firefox , так что, возможно, стоит загрузить один, чтобы поиграть с теми частями строгого режима, которые реализованы. Я бы все же сказал, что откажитесь от производственного использования, пока оно не будет завершено, но оно определенно готово к экспериментам (если вы понимаете, что строгий режим еще не полностью включен). (Что касается ссылки Шона Макмиллана, имейте в виду, что ее претензии на «поддержку» представляют собой предельный минимум функциональности, необходимой для каждой пули. Тесты в строгом режиме намного лучше, хотя, конечно, они далеко не полностью охватывают строгий режим). )