Строгий режим
↑ 1.4 JavaScript: основы · ← Предыдущая · → Следующая
Зачем это на собесе
Короткий вопрос, но показывает знание отличий режимов и того, где строгий режим включён по умолчанию.
Объяснение
Включается директивой "use strict" в начале файла или функции.
Во всех ES-модулях и классах строгий режим включён автоматически.
| Что меняется | Нестрогий режим | Строгий |
|---|---|---|
| Присваивание необъявленной переменной | создаёт глобальную | ReferenceError |
| Запись в неизменяемое свойство | молча игнорируется | TypeError |
| Дублирующиеся параметры | разрешены | ошибка |
this в обычной функции | window | undefined |
| Удаление неудаляемого | false | TypeError |
Восьмеричные литералы 010 | 8 | ошибка |
with, arguments.callee | доступны | запрещены |
Зарезервированные слова (let, static, interface) | ограничения слабее | ошибки |
"use strict";
function f() { return this; }
f(); // undefined (в нестрогом — window)
x = 5; // ReferenceError
Object.freeze({a: 1}).a = 2; // TypeErrorПричины использовать: раннее обнаружение ошибок, оптимизации движка, подготовка к будущим версиям языка.
Нюансы и подводные камни
- Директива в середине файла не работает.
- Смешивание строгих и нестрогих скриптов при конкатенации даёт неожиданное поведение.
evalв строгом режиме имеет свой scope.- TypeScript и бандлеры выдают строгий код по умолчанию.
Практика
- Проверьте различия на нескольких примерах в консоли.
- Найдите в проекте нестрогие файлы (без модулей).
Вопросы с ответами
Что даёт strict mode?
Превращает молчаливые ошибки в исключения, запрещает небезопасные конструкции, меняет
thisв функциях.
Где строгий режим включён по умолчанию?
В ES-модулях и в телах классов.