Загрузка...

Строгий режим

Строгий режим останавливает несколько ошибок, которые раньше проходили молча. "use strict" ставится первой строкой. После этого size = "regular" без let и без const не создаёт глобальное имя, а выбрасывает ReferenceError. Строка на этой странице — ReferenceError.

Список дел и страница ошибок — другие концы

Список дел закончился на done: buy tea. Страница ошибок нарочно бросила new Error("missing size"), и catch прочитал это сообщение. Здесь вы не бросаете свой Error. Движок бросает, потому что size так и не был объявлен. console.error по-прежнему не бросает.

Где директива имеет силу

"use strict" работает только как первая инструкция скрипта или как первая инструкция внутри одной функции. Строка ниже ничего не меняет. Одна функция может быть строгой, а остальной скрипт — нет. Модули уже строгие, поэтому директива там лишняя.

Что делает setSize

setSize присваивает size, не объявляя его. Вызов стоит в try. Глобальный size не появляется.

Присваивание без объявления

javascript
"use strict";
function setSize() {
size = "regular";
}
try {
setSize();
} catch (error) {
console.log(error.name);
}

В журнале ReferenceError. Починка такая: let size = "regular". Если drink равен tea и size объявлен, label может вернуть tea / regular. Запись в order.size — другой верный способ, потому что это имя существует.

Вызов по имени и вызов метода

Вызов функции по её имени не задаёт this. В строгом режиме this равен undefined. Вызов метода на order задаёт this этим объектом, поэтому this.drink равен tea.

this в вызове bare

javascript
"use strict";
function bare() {
return this;
}
const order = {
drink: "tea",
label() {
return this.drink;
}
};
console.log(bare());
console.log(order.label());

В журнале сначала undefined, потом tea. Не читайте this.drink внутри bare. Объекта там нет, и такое чтение бросает.

Четыре различия

Слева — старое тихое поведение. Справа — то, что делает директива.

📊 Что меняет директива

Старое тихое поведение С "use strict"
size = "regular" без объявления создаёт глобальное имя ReferenceError
this в bare — это глобальный объект undefined
Повторный параметр, побеждает последний SyntaxError
delete у объявленной переменной возвращает false SyntaxError

Повторный параметр или delete size срывается ещё при чтении скрипта: это SyntaxError, и try его не ловит. ReferenceError от присваивания возникает, когда функция выполняется, поэтому catch его видит. delete order.drink по-прежнему разрешён в обоих режимах, если свойство можно удалить.

Сама страница

Страница — один строгий скрипт. Присваивание срывается, и имя ошибки пишется на странице.

Страница с ReferenceError

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
"use strict";
const line = document.querySelector("#line");
try {
size = "regular";
} catch (error) {
line.textContent = error.name;
}
</script>
</body>
</html>

Строка читается как ReferenceError. Не done: buy tea. Не caught / missing size. Поставьте let перед size — и этот catch перестанет выполняться.

Пять коротких шагов

  1. Запустите setSize под "use strict". В журнале ReferenceError.
  2. Замените присваивание на let size = "regular". Бросок исчезает.
  3. Вызовите bare(). Значение — undefined.
  4. Вызовите order.label(). Значение — tea.
  5. Прочитайте страницу. Строка — ReferenceError.

Настоящие промахи

  • Поставить директиву после другой инструкции
  • Ждать, что необъявленное присваивание создаст глобальное имя
  • Читать this.drink внутри вызова bare
  • Ловить повторный параметр через try
  • Прочитать строку как done: buy tea
  • Прочитать её как caught / missing size

Запомните

  • Сначала директива
  • Необъявленное size = "regular" выбрасывает ReferenceError
  • this в bare равен undefined, а order.label() возвращает tea
  • Повторные параметры и delete у переменной — это SyntaxError
  • Строка на странице — ReferenceError

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
6
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху