В ECMAScript5, какова область применения строгого использования? - PullRequest
41 голосов
/ 26 февраля 2010

Какова область действия прагмы строгого режима в 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?

Ответы [ 4 ]

55 голосов
/ 08 октября 2010

"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 , так что, возможно, стоит загрузить один, чтобы поиграть с теми частями строгого режима, которые реализованы. Я бы все же сказал, что откажитесь от производственного использования, пока оно не будет завершено, но оно определенно готово к экспериментам (если вы понимаете, что строгий режим еще не полностью включен). (Что касается ссылки Шона Макмиллана, имейте в виду, что ее претензии на «поддержку» представляют собой предельный минимум функциональности, необходимой для каждой пули. Тесты в строгом режиме намного лучше, хотя, конечно, они далеко не полностью охватывают строгий режим). )

4 голосов
/ 27 февраля 2010

РЕДАКТИРОВАТЬ Кажется, я ошибся. Пожалуйста, смотрите ответ Джеффа Уолдена ниже .

Ознакомьтесь с этим ответом на связанный вопрос: Что такое «использование строгого» в JavaScript и каковы причины этого?

Несмотря на жалобы JSLint, вы можете (и должен ) использовать "use strict"; внутри функции, если хотите, чтобы эта функция находилась только в строгом режиме. Если вы используете его в глобальном контексте, то это заставит весь ваш код работать в строгом режиме. Краткий ответ: Да, это заблокирует использование вами eval.

0 голосов
/ 12 января 2018

Весь файл:

<script...>
  "use strict";

или

Вся функция и ее встроенные функции например:

function fn(){
  "use strict";
0 голосов
/ 08 июня 2016
eval( somecodesnippet ); // disallowed by "use strict"

Нет, если вы объявите somecodesnippet раньше.

var somecodesnippet = "ваш замечательный кодекс здесь";

eval (somecodesnippet); // НЕ запрещен "использовать строгий"

...