Строгий режим
Ранние версии JavaScript прощали многие ошибки: опечатка в имени переменной молча создавала новую переменную, неудачная запись в свойство просто игнорировалась. Чтобы не ломать старые сайты, это поведение оставили, но добавили строгий режим (strict mode) — вариант языка, в котором такие ошибки становятся настоящими ошибками.
Включение строгого режима
Строгий режим включает строка 'use strict'; в самом начале файла или функции. Это не команда, а директива — указание для движка JavaScript:
'use strict';
console.log('Строгий режим включён'); // Строгий режим включёнВ примерах этого урока директива стоит первой строкой, поэтому действует на весь пример.
Опечатки в именах
Без строгого режима присваивание необъявленной переменной создаёт новую глобальную переменную. Опечатка проходит незамеченной:
let count = 0;
conut = 5;
console.log(count); // 0В строгом режиме та же опечатка сразу вызывает ошибку ReferenceError:
'use strict';
let total = 0;
try {
totl = 10;
} catch (error) {
console.log(error.name); // ReferenceError
}this в обычной функции
В обычном режиме функция, вызванная без объекта, получает в this глобальный объект — и может случайно что-то в нём испортить. В строгом режиме this равен undefined:
'use strict';
function whoAmI() {
return this;
}
console.log(whoAmI()); // undefinedЗапись в защищённые свойства
Запись в замороженный объект или в свойство, доступное только для чтения, обычно молча игнорируется. Строгий режим сообщает о ней ошибкой:
'use strict';
const config = Object.freeze({ currency: '€' });
try {
config.currency = '$';
} catch (error) {
console.log(error.name); // TypeError
}Запрещённый синтаксис
Некоторые устаревшие конструкции в строгом режиме запрещены совсем, и код с ними даже не запустится — будет SyntaxError. Например, одинаковые имена параметров:
'use strict';
function sum(a, a) {
return a + a;
}Также запрещены конструкция with и числа с ведущим нулём вроде 010.
Где строгий режим включён сам
Писать директиву нужно не всегда. Код модулей (файлов с import и export) и тела классов всегда работают в строгом режиме:
class Counter {
reset() {
try {
resetValue = 0;
} catch (error) {
console.log(error.name);
}
}
}
new Counter().reset(); // ReferenceErrorВ современных проектах почти весь код — модули, поэтому строгий режим там включён по умолчанию.
Частая ошибка
Поставить 'use strict' не в начало. Директива работает, только если стоит первой инструкцией файла или функции, иначе это просто строка, которая ничего не делает:
console.log('Старт'); // Старт
'use strict';
function whoAmI() {
return this === undefined;
}
console.log(whoAmI()); // false