Strict mode
Strict mode — режим строгого выполнения JavaScript, который запрещает небезопасные конструкции и выбрасывает ошибки там, где обычный режим молчит.
Зачем нужно
Обычный JS слишком «прощающий»: позволяет создавать глобальные переменные случайно, присваивать значения read-only свойствам без ошибок. Strict mode делает код безопаснее и помогает находить баги раньше.
Где используется
- Модули ES6 (strict по умолчанию)
- Классы (strict по умолчанию)
- Современные проекты с бандлерами
- Любой новый код (рекомендуется)
Предпосылки
Как включить
// 1. Для всего файла — в первой строке
'use strict';
// Весь код ниже в strict mode
let x = 10;
// 2. Для функции
function strict() {
'use strict';
// Только эта функция в strict mode
}
// 3. Автоматически включён в:
// - ES6 модулях (import/export)
// - Классах (class)
// - Arrow functions внутри strict-контекста
Что запрещает strict mode
1. Необъявленные переменные
'use strict';
// mistake = 42; // ReferenceError: mistake is not defined
// В обычном режиме создалась бы глобальная переменная
2. Присваивание read-only свойствам
'use strict';
const obj = {};
Object.defineProperty(obj, 'x', { value: 42, writable: false });
// obj.x = 99; // TypeError: Cannot assign to read-only property
// Присваивание getter-у без setter-а
const config = {
get name { return 'readonly'; }
};
// config.name = 'new'; // TypeError
// Расширение нерасширяемого объекта
const frozen = Object.freeze({ a: 1 });
// frozen.b = 2; // TypeError
3. Удаление неудаляемых свойств
'use strict';
// delete Object.prototype; // TypeError
// delete undefined; // SyntaxError
const obj = {};
Object.defineProperty(obj, 'fixed', { configurable: false, value: 1 });
// delete obj.fixed; // TypeError
4. Дублирование параметров
'use strict';
// function sum(a, a, b) {} // SyntaxError: Duplicate parameter name
// В обычном режиме последний a перезаписал бы первый
5. Восьмеричные литералы без 0o
'use strict';
// const n = 010; // SyntaxError
const n = 0o10; // OK — явный синтаксис восьмеричных
6. with запрещён
'use strict';
// with (Math) { log(PI); } // SyntaxError
7. this в функциях = undefined
'use strict';
function showThis() {
console.log(this); // undefined
}
showThis;
// В обычном режиме this === window (браузер) или global (Node)
8. eval не создаёт переменные в окружающем scope
'use strict';
eval('var x = 42');
// console.log(x); // ReferenceError — x не утекла наружу
// В обычном режиме x была бы доступна
Что НЕ меняет strict mode
'use strict';
// Типы данных, операторы, циклы — работают так же
// Promise, async/await — работают так же
// DOM API — работает так же
// Замыкания — работают так же
Частые ошибки
1. Strict mode после другого кода
const x = 10;
'use strict'; // Не работает! Должно быть первой инструкцией
// Комментарии ДО — допустимы
// 'use strict'; // Это просто строка-литерал, не включит strict mode
2. Забыл что модули уже strict
// module.js
// 'use strict'; — не нужно, модуль уже strict
export function test() {
// mistake = 42; // ReferenceError — strict по умолчанию
}
Практика
- Напиши код без strict mode, создающий случайную глобальную переменную, затем включи strict mode
- Попробуй изменить свойство замороженного объекта в strict mode
- Покажи разницу
thisв обычной функции с и без strict mode
Связанные темы
Ресурсы
⚡ Источник: ⎡spec03⎦ Hoisting согласно спецификации · AsForJS
- 📅 2023-11-19 · YouTube
- Тезисы: strict mode меняет правила instantiation и binding. Например, в strict нельзя создать переменную без объявления (
x = 5безvar/let→ ReferenceError). Модули и классы — всегда strict