Похоже, но не то же самое, что, Как включить ECMAScript «строгое использование» глобально?
Я купил Шаблоны JavaScript и он рекомендует разрешить использование строго. Добавление его к двум дюжинам файлов javascript было бы непростой задачей, поэтому было бы неплохо включить его глобально. Первоначально я думал о добавлении в начало моего main.js вот такого:
"use strict"
require({
priority: ["jquery", "raphael", "myapp"]
});
Однако потом я подумал, что он, возможно, включит его только для этого файла. Затем я подумал об этом:
Включит ли какой-либо из них строгий режим ECMAScript 5 в глобальном масштабе?
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
не определено.
Если я добавлю этот скрипт-тег на страницу:
<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
, браузер должен игнорировать контент, и большинство делать. Наиболее. : -)