Avatar ·

Что делает "use strict" в JavaScript и зачем он нужен? Объяснение для новичков

Всем привет! Я только начал изучать JavaScript и наткнулся на странную конструкцию: `"use strict";`. Видел её в начале некоторых скриптов и функций, но не понимаю, зачем она нужна и что делает. Вот пример кода, который у меня работает без `"use strict"`: ```javascript x = 10; // Я не объявил переменную через var, let или const console.log(x); // Выводит 10 ``` Но когда я добавляю `"use strict"`: ```javascript "use strict"; x = 10; // Ошибка: x is not defined console.log(x); ``` Почему в первом случае код работает, а во втором выдаёт ошибку? Я слышал, что `"use strict"` делает код "безопаснее", но не понимаю, в чём именно заключается эта безопасность. И ещё вопрос: нужно ли его всегда использовать? Может, он только замедляет код? Объясните, пожалуйста, для новичков: что это за директива, как она работает и почему её рекомендуют все опытные разработчики? Желательно с примерами, чтобы было понятно. <<>>

Что такое "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) — они автоматически включают строгий режим для каждого модуля. Это самый чистый и безопасный подход.