Strict mode

Strict mode — режим строгого выполнения JavaScript, который запрещает небезопасные конструкции и выбрасывает ошибки там, где обычный режим молчит.

Зачем нужно

Обычный JS слишком «прощающий»: позволяет создавать глобальные переменные случайно, присваивать значения read-only свойствам без ошибок. Strict mode делает код безопаснее и помогает находить баги раньше.

Где используется

  • Модули ES6 (strict по умолчанию)
  • Классы (strict по умолчанию)
  • Современные проекты с бандлерами
  • Любой новый код (рекомендуется)

Предпосылки

Переменные, Scope

Как включить

// 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 по умолчанию
}

Практика

  1. Напиши код без strict mode, создающий случайную глобальную переменную, затем включи strict mode
  2. Попробуй изменить свойство замороженного объекта в strict mode
  3. Покажи разницу this в обычной функции с и без strict mode

Связанные темы

Ресурсы


⚡ Источник: ⎡spec03⎦ Hoisting согласно спецификации · AsForJS

  • 📅 2023-11-19 · YouTube
  • Тезисы: strict mode меняет правила instantiation и binding. Например, в strict нельзя создать переменную без объявления (x = 5 без var/let → ReferenceError). Модули и классы — всегда strict