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