2010-02-26 3 views
39

Какая область применения прагмы строгого режима в ECMAScript5?В ECMAScript5, какова область применения «строгого использования»?

"use strict"; 

Я хотел бы сделать это (в основном потому, что JSLint не жалуется на него):

"use strict"; 

(function() { 
    // my stuff here... 
}()); 

Но я не уверен, что нарушило бы другой код или нет. Я знаю, что я могу это сделать, что будет сфера прагму к функции ...

(function() { 

    "use strict"; 

    // my stuff here... 

}()); 

но JSLint жалуется на него (когда «строгий» вариант JSLint включена), потому что он думает, что вы выполнение кода прежде чем вы включите «использовать строгую».

Вот мой вопрос. Если у меня есть fileA.js:

"use strict"; 
// do some stuff 

и fileB.js:

eval(somecodesnippet); // disallowed by "use strict" 

, а затем включить их в моем HTML-страницы в том же порядке, будет прагма быть ограничена в файл, или будет прагма истекает в fileB, тем самым блокируя выполнение eval?

+0

Побочным примечание: презентация Дуглада Крокфорда «Состояние и будущее Javascript была действительно велика». Он обсуждает некоторые новые функции, такие как строго в конце разговора. Вот ссылка: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –

+0

'eval()' разрешено с '' use strict '', оно просто распространяется во всем мире. –

ответ

2

EDIT Похоже, что я был некорректен. См. Jeff Walden's answer below.

Проверьте этот ответ на соответствующий вопрос: What does "use strict" do in JavaScript, and what is the reasoning behind it?

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

+2

Этот ответ неверен. Использование директивы в верхней части 'fileA.js' приводит к тому, что весь файл будет находиться в строгом режиме, но это не приведет к тому, что' fileB.js' будет находиться в строгом режиме, независимо от того, какой порядок они включены в HTML-страницу , Кроме того, 'eval()' работает по-разному в строгом режиме, но он все еще работает. Это не «заблокировано». –

54

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

+4

«Строгость абсолютно не« кровоточит »- это не совсем правильно. Вы не можете использовать '.caller' в нестрочном коде, когда функция, в которой вы его используете, была определена в строгом режиме. Таким образом, нестрогий код может фактически нарушаться из-за того, что другой код находится в строгом режиме - я бы подумал, что это кровотечение. – AndreKR

+1

То, как был сформулирован исходный вопрос, я бы интерпретировал «кровотечение» в смысле лексического, текстового исходного кода - сценарий В, определяющий строгость из сценария А, без необходимости выбора самой строгости. Очевидно, что эффекты скрипта (в том числе вызванные строгостью) видны - «кровоточить», можно сказать, - в других сценариях.* Характер * эффекта может различаться в зависимости от строгости сценария запуска. Но строгие или нет, эффекты скрипта видны в другом. Это не кажется особенно полезным определением «кровотечения» для меня. –

0
eval(somecodesnippet); // disallowed by "use strict" 

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

var somecodesnippet = "your awesome codesnippet here";

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

0

Весь файл:

<script...> 
    "use strict"; 

или

Вся функция и ее погруженных функции , например:

function fn(){ 
    "use strict"; 
+0

Существует уже принятый ответ, который решает проблему OP. Ваше качество не добавляет больше. –

Смежные вопросы