Перейти к содержимому

Strict Mode

“use strict” включён по умолчанию в ESM-модулях и телах классов; он запрещает ряд “silent” ошибок, меняет семантику this (нет coercion к global) и связывает руки оптимизаторам, которые не могут работать с with и динамическим eval.

// Sloppy vs Strict: разница в this
function sloppyThis() { return this; }
function strictThis() { 'use strict'; return this; }
sloppyThis(); // window (browser) / global (Node.js) — тихая ловушка
strictThis(); // undefined — явная ошибка лучше тихого бага
// В классах strict mode всегда включён:
class MyClass {
method() { return this; }
}
const { method } = new MyClass();
method(); // undefined — не global! (отвязан от экземпляра)
// ESM (.mjs): весь файл в strict mode, не нужна директива
// <script type="module">: тоже строгий режим
// Запрещённые конструкции в strict mode
'use strict';
// 1. Необъявленные переменные
// x = 5; // ReferenceError (в sloppy: тихое создание global)
// 2. Запись в read-only/non-writable
const obj = Object.freeze({ x: 1 });
// obj.x = 2; // TypeError (в sloppy: тихо игнорируется!)
// 3. Дублирование параметров
// function dup(a, a) {} // SyntaxError
// 4. with statement (мешает статическому анализу scope)
// with (obj) {} // SyntaxError
// 5. Удаление non-configurable
// delete Object.prototype; // TypeError
// 6. eval / arguments как имена переменных
// let eval = 1; // SyntaxError
// Разрыв связи arguments ↔ параметры в strict mode
function sloppy(a) {
arguments[0] = 99;
return a; // 99 — arguments и параметры aliased в sloppy mode
}
function strict(a) {
'use strict';
arguments[0] = 99;
return a; // исходное значение — связь разорвана
}
console.log(sloppy(1)); // 99
console.log(strict(1)); // 1
// Влияние на V8: с arguments object (escaped) нельзя применить
// escape analysis → нельзя выделить a на стеке
// rest params (...args) строгие по умолчанию и оптимизируются лучше

Итог: Strict mode устраняет silent failures, разрывает магические связи (arguments, this coercion), запрещает with и дублирование параметров; в современном коде включён по умолчанию через ESM и class bodies.