Позволит ли это «использовать строгое» во всем мире? - PullRequest
28 голосов
/ 26 июня 2011

Похоже, но не то же самое, что Как включить ECMAScript "использовать строгое" во всем мире?

Я купил Шаблоны JavaScript , и он рекомендует включить строгое использование. Добавление его в две дюжины файлов javascript было бы непростой задачей, поэтому было бы неплохо включить его в глобальном масштабе. Первоначально я думал о добавлении в начало моего main.js, как это:

"use strict" 
require({
    priority: ["jquery", "raphael", "myapp"] 
});

Однако тогда я подумал, что, возможно, он включит его только для этого файла. Я тогда подумал об этом:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

Может ли любой из них включить глобальный строгий режим ECMAScript 5?

Ответы [ 3 ]

42 голосов
/ 26 июня 2011

TL; DR :

Нет, "use strict" в одном элементе script не накладывает "use strict" на код в других элементах script.Он применяется только к исходному тексту, частью которого он является.

(Отдельно, отметьте тег script в конце вопроса: если элемент script имеет src, то любой встроенный текст имеетсчитается «документацией» и игнорируется.)


Обновление :

Теперь в спецификации все яснее (возможно, это было понятно в ES5, но просто нетмне) что да, отдельные элементы script являются отдельными для целей "use strict".Цитата ниже в исходном ответе была слегка изменена , чтобы сказать «исходный текст», а не «кодовая единица», а раздел Сценарии и модули более детально описан.


Оригинальный ответ :

В спецификации указано:

Поскольку строгий режим выбран на уровнеСинтаксическая единица кода, строгий режим только налагает ограничения, которые имеют локальный эффект внутри такой единицы кода.Строгий режим не ограничивает и не изменяет какой-либо аспект семантики ECMAScript, который должен работать последовательно для нескольких единиц кода.

(раздел 4.2.2)

Итаквопрос в том, являются ли разные script теги разными единицами синтаксического кода?

V8 (механизм JavaScript внутри Chrome), кажется, считает, что они являются отдельными и, таким образом, помещают один "use strict";в глобальном масштабе вверху вашей страницы не будет работать.Возможно, он указан где-то, чего я еще не нашел, но в любом случае это разумная интерпретация.

Если не принять никакого объявления для foo, которое не показано, этот код становится жертвой Ужасиз неявных глобалов в обычном режиме:

function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}

В обычном режиме это создает новую глобальную переменную foo со значением "bar" и отображает сообщение "foo = bar".В строгом режиме выдается исключение, потому что foo не определено.

Если я помещаю этот тег сценария на страницу:

<script>
"use strict";
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

... Я получаю исключение, как и ожидалось ( живой пример ).Если я помещу их в отдельные теги script, то:

<script>
"use strict";
</script>
<script>
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

Я не не получу исключение (на V8) ( пример ).И это разумно, если вы подумаете о том, как взаимодействуют браузер и движок JavaScript.

И точно так же, если функция отключена в другом файле, и я делаю это:

<script>
"use strict";
</script>
<script src="/inatoq"></script>

Я надеваюНе получите исключение ( пример ), предположительно по той же причине.

Обратите внимание, что ваш пример тега здесь:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

недействителен.Тег script может либо иметь атрибут src или , но не оба вместе.(Ну, в основном; подробности здесь [HTML5] и здесь [HTML 4.01].) Если он имеет элемент src, браузер должен игнорировать контент, и большинстводелать.Наиболее.: -)

8 голосов
/ 13 апреля 2012
6 голосов
/ 26 июня 2011

нет, теги сценария считаются programs и для этого code units."use strict" не должно переходить от одного тега сценария к другому.

Каждый тег сценария интерпретируется индивидуально и фактически имеет свою область видимости.Эта область видимости не заметна, так как все, что объявлено глобально, попадет в глобальный объект, но, тем не менее, оно есть.Строка "use strict" будет собирать мусор в конце тега program / script, поскольку она не имеет указателя / ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...