JS Advanced

Строгий режим "use strict"

Понять, что делает strict mode, какие ошибки он предотвращает, и почему в modern modules он уже включён по умолчанию.

Продвинутый (Advanced)
Нужно знать:Стиль кода

Кратко

"use strict" включает строгий режим JavaScript. Он запрещает опасные конструкции: необъявленные переменные, дублирование параметров, удаление свойств. В ES modules strict mode включён автоматически — отдельная директива нужна только в legacy script.


Подробно

"use strict" — директива, которая включает более строгий разбор и выполнение кода.

Что запрещает:

  • Использование переменной до объявления
  • Дублирование имён параметров
  • Удаление переменной, функции или аргумента (delete obj.var)
  • Запрещённые синтаксисы (octal literals: 0123)
  • Запись в read-only свойства

Где включается:

  • В модулях (type="module") — ВСЕГДА автоматически
  • В функциях: "use strict" в начале тела функции
  • В скриптах: "use strict" в начале файла

Где НЕ нужен:

  • ES modules (уже strict)
  • modern bundler code (обычно уже strict)

Почему modules strict: ES modules (import/export) работают в strict mode по спецификации. Это сделано для предсказуемости и безопасности.

Пример legacy контекста: // Старый script (не module) "use strict"; var x = 1; delete x; // SyntaxError в strict mode

// Модуль — strict по умолчанию export const y = 2; delete y; // SyntaxError без явной директивы


Ментальная модель

Strict mode — как шериф в маленьком городке. Обычный JavaScript — город без правил (можно писать опасный код). Strict mode — шериф, который говорит: «Нет, так нельзя. Объяви переменную правильно. Не удаляй то, что нельзя.» Модули — город, где шериф работает всегда.


Примеры

**Самый простой:**

javascript
// Без strict mode
myVar = 10; // создаёт глобальную переменную
console.log(myVar); // 10

// С strict mode
"use strict";
// myVar = 10; // ReferenceError: myVar is not defined

Strict mode запрещает необъявленные переменные.

**Простой:**

javascript
// Дублирование параметров
function sum(a, a, b) {
  return a + a + b;
}
// Без strict: работает (первый a перезаписывается)
// С strict: SyntaxError

function sumStrict(a, a, b) {
  "use strict";
  return a + a + b;
}
// SyntaxError: Duplicate parameter name

Strict mode ловит ошибки, которые были бы молча проигнорированы.

**Реальный пример:**

javascript
// Modern ES module — strict по умолчанию
// math.js
export function add(a, b) {
  return a + b;
}

// main.js
import { add } from "./math.js";

// Без объявления переменной:
// result = add(1, 2); // ReferenceError
// Нужно:
const result = add(1, 2);

В модулях strict mode работает автоматически — директива не нужна.


Частые ошибки

**Неправильно:** Добавлять "use strict" в каждый файл модуля

**Почему:** ES modules уже работают в strict mode. Дублирование — лишний код.

**Правильно:** В модулях (import/export) директива не нужна. Только в legacy script.

**Неправильно:** Думать, что strict mode замедляет код

**Почему:** Strict mode не влияет на производительность. Он только запрещает опасные конструкции.

**Правильно:** Strict mode = безопасность, не производительность.

**Неправильно:** Путать strict mode с TypeScript strict mode

**Почему:** JavaScript strict mode и TypeScript strict (транспилирование) — разные вещи.

**Правильно:** JS "use strict" — runtime проверки. TS strict — compile-time проверки.


Важно запомнить

  • use strict запрещает опасные конструкции
  • ES modules работают в strict mode автоматически
  • Strict mode нужен только в legacy script
  • Запрещает необъявленные переменные, дублирование параметров
  • Не влияет на производительность

Связь

Назад: Вы знаете JavaScript Core (J0–J26). Строгий режим — это глобальное изменение поведения, которое влияет на то, как выполняется код.

Вперёд: Следующий урок (JV2) — именованные функциональные выражения — конкретный синтаксис функций.

Материалы курса JS Advanced — PROlab Academy.