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

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

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

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

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


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

28
задан Community 23 May 2017 в 11:46
поделиться

1 ответ

TL; DR :

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

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

< hr>

Обновление :

Теперь в спецификации стало понятнее (возможно, это было понятно в 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, браузер должен игнорировать контент, и большинство делать. Наиболее. : -)

42
ответ дан 28 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: