Кратко
"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 — шериф, который говорит: «Нет, так нельзя. Объяви переменную правильно. Не удаляй то, что нельзя.» Модули — город, где шериф работает всегда.
Примеры
**Самый простой:**
// Без strict mode
myVar = 10; // создаёт глобальную переменную
console.log(myVar); // 10
// С strict mode
"use strict";
// myVar = 10; // ReferenceError: myVar is not definedStrict mode запрещает необъявленные переменные.
**Простой:**
// Дублирование параметров
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 nameStrict mode ловит ошибки, которые были бы молча проигнорированы.
**Реальный пример:**
// 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) — именованные функциональные выражения — конкретный синтаксис функций.