Подтвердить что ты не робот

В 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?

4b9b3361

Ответ 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);//НЕ запрещается "использовать строгий"