В ECMAScript5, каков объем "строгого использования"?
Какую область действия имеет прагма строгого режима в ECMAScript5?
"use strict";
Я хотел бы сделать это (в основном потому, что JSLint не жалуется на это):
"use strict";
(function () {
// my stuff here...
}());
Но я не уверен, что это сломает другой код или нет. Я знаю, что я могу это сделать, что расширит прагму функции...
(function () {
"use strict";
// my stuff here...
}());
но JSLint жалуется на это (когда включен параметр "строгий" JSLint), потому что он считает, что вы выполняете код, прежде чем включить "использовать строгий".
Вот мой вопрос. Если у меня есть файлA.js:
"use strict";
// do some stuff
и fileB.js:
eval( somecodesnippet ); // disallowed by "use strict"
а затем включить их в мою страницу html в том же порядке, будет ли прагма привязана к файлу или будет ли прагма перечеркнута в файлB, что блокирует выполнение eval?
Ответы
Ответ 1
РЕДАКТИРОВАТЬ Похоже, я ошибался. См. Джефф Уолден ниже.
Проверьте этот ответ на соответствующий вопрос: Что такое "use strict" делать в JavaScript и каковы причины этого?
Несмотря на жалобы JSLint, вы можете (и должны) использовать "use strict";
внутри функции, если вы хотите, чтобы эта функция находилась в строгом режиме. Если вы используете его в глобальном контексте, он заставит весь ваш код находиться в строгом режиме. Короткий ответ: да, это заблокирует ваше использование eval
.
Ответ 2
"use strict"
применяется только к области функций или программ. Поэтому, если у вас есть файл File.js с "use strict"
вверху, файлA.js выполняется в строгом режиме, и все функции, определенные в нем, будут делать то же самое при вызове. Но fileB.js - отдельная программа, поэтому "use strict"
from 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
всегда оценивается как строгий mode, даже если code
не запускается с директивой "use strict"
, и за исключением того, что любые переменные, созданные кодом, хранятся в отдельном хранилище от любых существующих переменных. (Точная семантика немного сложна, я работаю над движком JavaScript в Firefox, в последнее время реализую этот материал, и даже после довольно большого количества времени в спецификации и работы над реализацией он все еще не интуитивно для меня.)
Если он не называется таким образом - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
и т.д. - это "косвенная" оценка. Косвенная оценка (как внутри, так и снаружи строгого режима) ведет себя несколько иначе: разрешение имен и определение переменной происходят, как в глобальной области. (Код будет выполняться как строгий код режима, только если он начинается с директивы "use strict"
.)
Поддержка строгого режима почти - но не полностью - завершена в последнем Firefox nightlies, поэтому, возможно, стоит скачать один для воспроизведения вокруг с теми частями строгого режима, которые реализованы. Я бы все же сказал, что держится на производстве, пока он не завершится, но он определенно готов к экспериментированию (пока вы понимаете строгий режим еще не полностью). (Что касается ссылки Шона Макмиллана, имейте в виду, что его претензии на "поддержку" представляют собой минимальный минимум функциональности, необходимый для каждой пули. Тесты строгого режима намного лучше, хотя они не могут быть полностью закрыты для строгого режима. )
Ответ 3
eval( somecodesnippet ); // disallowed by "use strict"
Нет, если раньше вы объявляете somecodesnippet.
var somecodesnippet = "ваш удивительный код здесь";
eval (somecodesnippet);//НЕ запрещается "использовать строгий"