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

Будет ли это позволять "использовать строгое" глобально?

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

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

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

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

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

Будет ли любой из них разрешать строгий режим ECMAScript 5 глобально?

4b9b3361

Ответ 1

TL; DR:

Нет, a "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 - undefined.

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

<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, браузер должен игнорировать содержимое, и большинство из них делает это. Наиболее.: -)

Ответ 3

нет, script теги считаются programs и предназначены для code units. "use strict" не должен переноситься из одного тега script в другой.

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