Что делает "use strict" в JavaScript и зачем он нужен? Объяснение для новичков
Что такое "use strict" и зачем он нужен?
"use strict" — это директива (специальная строка), которая включает строгий режим выполнения JavaScript. Она была добавлена в стандарт ECMAScript 5 (2009 год), чтобы исправить некоторые проблемные и небезопасные особенности языка. Когда вы пишете "use strict" в начале скрипта или функции, интерпретатор JavaScript начинает работать по более строгим правилам.
Основные изменения в строгом режиме
Вот ключевые отличия строгого режима от обычного (нестрогого):
1. Запрет на неявное создание глобальных переменных
В обычном режиме, если вы присваиваете значение переменной, не объявив её через var, let или const, JavaScript автоматически создаёт глобальную переменную. Это очень опасно — вы можете случайно перезаписать важную переменную или создать утечку памяти.
// Обычный режим
function sum(a, b) {
result = a + b; // Ошибка! result стал глобальной переменной
return result;
}
sum(2, 3);
console.log(result); // 5 — переменная result доступна снаружи функции!
// Строгий режим
"use strict";
function sumStrict(a, b) {
result = a + b; // ReferenceError: result is not defined
return result;
}
sumStrict(2, 3);
2. Запрет на удаление неизменяемых свойств
В строгом режиме вы не сможете удалить свойства, которые не предназначены для удаления (например, prototype у встроенных объектов).
"use strict";
delete Object.prototype; // TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
3. Запрет на дублирование параметров функции
В строгом режиме нельзя объявлять функцию с одинаковыми именами параметров:
"use strict";
function foo(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context
console.log(a);
}
4. Изменение поведения this
В обычном режиме, если вызвать функцию без контекста (как обычную функцию), this внутри неё будет ссылаться на глобальный объект (window в браузере). В строгом режиме this будет undefined:
"use strict";
function showThis() {
console.log(this); // undefined (вместо window)
}
showThis();
5. Запрет на использование with
Конструкция with полностью запрещена в строгом режиме, так как она создаёт путаницу с областью видимости:
"use strict";
with (Math) { // SyntaxError: Strict mode code may not include a with statement
console.log(PI);
}
Нужно ли всегда использовать "use strict"?
Да, настоятельно рекомендуется. Вот причины:
- Безопасность — предотвращает случайное создание глобальных переменных и другие опасные операции.
- Производительность — в некоторых движках (например, V8 в Chrome) строгий режим работает быстрее, так как позволяет оптимизировать код.
- Современный код — все современные модули (ES6 modules) и классы (
class) автоматически работают в строгом режиме. - Ошибки раньше — вы узнаете о проблемах на этапе разработки, а не в production.
Как правильно использовать?
Если вы пишете скрипт — добавьте строку в самом начале файла:
"use strict";
// Весь ваш код здесь
Если вы используете модули (например, через <script type="module">) или классы — строгий режим включается автоматически. В этом случае писать "use strict" не нужно.
Важно: строгий режим не замедляет код, а наоборот — может ускорить его за счёт лучшей оптимизации движком.
<<Дополнение: "use strict" в функциях vs во всём файле
Вы можете включать строгий режим не только для всего файла, но и для отдельных функций. Это полезно, если вы работаете с чужим кодом, который не поддерживает строгий режим, но хотите сделать свою часть кода безопаснее.
function oldFunction() {
// Обычный режим — работает с legacy-кодом
x = 10; // Создаст глобальную переменную
}
function newFunction() {
"use strict";
x = 10; // ReferenceError — переменная не объявлена
let y = 20;
return y;
}
oldFunction();
newFunction(); // Ошибка здесь
Когда НЕ стоит использовать "use strict"?
Есть два случая, когда строгий режим может быть нежелателен:
- Склейка скриптов — если вы объединяете несколько файлов в один, и какой-то из них не в строгом режиме, могут возникнуть конфликты. Решение: оборачивайте каждый скрипт в IIFE (Immediately Invoked Function Expression):
(function() { "use strict"; ... })(); - Очень старые библиотеки — некоторые древние библиотеки (например, версии jQuery до 1.7) могут работать некорректно в строгом режиме из-за использования
withилиarguments.callee. Но это редкий случай — современные библиотеки полностью совместимы.
Совет: в современных проектах используйте ES6-модули (через import/export) или сборщики (Webpack, Vite) — они автоматически включают строгий режим для каждого модуля. Это самый чистый и безопасный подход.