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