Что такое строгий режим use strict в JavaScript?
Что такое strict mode
'use strict' — это специальная директива-строка, которая включает строгий режим выполнения JavaScript. Она появилась в ECMAScript 5 и заставляет движок интерпретировать код строже: многие ошибки, которые раньше молча игнорировались или приводили к неявному поведению, теперь выбрасывают исключения.
Как включить
Директиву можно поставить в начале файла — тогда она действует на весь скрипт, либо в начале функции — тогда только на неё:
'use strict';
function foo() {
// код выполняется в строгом режиме
}
Важный нюанс: ES-модули (import/export) и тела классов работают в строгом режиме по умолчанию, без явной директивы.
Что меняется в строгом режиме
- Присваивание необъявленной переменной больше не создаёт глобальную переменную — выбрасывается
ReferenceError. - Попытки записать значение в неизменяемое или защищённое свойство (например, объект с
writable: false) выбрасываютTypeErrorвместо тихого игнорирования. deleteдля переменных, функций или необъявляемых свойств вызываетSyntaxError.- Запрещены дублирующиеся имена параметров функции.
- Внутри обычной функции, вызванной без контекста,
thisравенundefined, а не глобальному объекту. - Зарезервированные слова будущих версий языка (
implements,interface,package,private,protected,public,static,yield) нельзя использовать как идентификаторы. - Конструкция
withполностью запрещена и вызываетSyntaxError. - Объект
argumentsбольше не синхронизируется с именованными параметрами функции при их изменении. - Восьмеричные литералы вида
010запрещены — нужно писать0o10.
Зачем это нужно
Строгий режим помогает раньше отлавливать ошибки на этапе разработки, делает поведение кода более предсказуемым и одинаковым в разных движках, а также упрощает оптимизацию кода JS-движками, потому что часть неоднозначных конструкций запрещена.
Пример разницы поведения
// Обычный режим
function normal() {
x = 10; // случайно создаётся глобальная переменная x
console.log(x); // 10
}
// Строгий режим
function strict() {
'use strict';
y = 10; // ReferenceError: y is not defined
}
На собеседовании важно показать не только знание синтаксиса директивы, но и понимание, какие именно классы ошибок она переводит из «тихих» в явные, и что современный код (модули, классы) уже строгий по умолчанию.
Что хочет услышать интервьюер
Кандидат объясняет, что 'use strict' включает более строгую проверку ошибок и запрещает часть небезопасных конструкций
Знает области действия директивы: весь файл, отдельная функция, модуль целиком
Понимает конкретные отличия поведения: this в обычной функции, запрет на неявные глобальные переменные, ошибки при недопустимых операциях
Знает, что ES-модули и классы работают в строгом режиме по умолчанию
Может привести пример кода, который ведёт себя по-разному в обычном и строгом режимах
Пример: Включение strict mode на уровне файла и функции
'use strict';
function sum(a, b) {
return a + b;
}
function onlyThisFunctionIsStrict() {
'use strict';
// здесь тоже действует строгий режим
}
Пример: Ошибка, которая проявляется только в строгом режиме
'use strict';
function test() {
// без объявления переменной через let/const/var
total = 100; // ReferenceError: total is not defined
}
test();
Типичные ошибки
Считают, что 'use strict' нужно прописывать в каждой функции отдельно, не понимая, что директива в начале файла действует на весь скрипт
Путают строгий режим с TypeScript, линтерами (ESLint) или транспиляцией — это разные вещи
Не знают, что в классах и ES-модулях строгий режим включён по умолчанию без явной директивы
Забывают, что this в обычной функции без контекста вызова в строгом режиме равен undefined, а не глобальному объекту
Ошибочно полагают, что строгий режим снижает производительность, хотя на практике он чаще помогает оптимизациям движка


