W3docs

Строгий режим JavaScript ("use strict")

Строгий режим — ключевая возможность JavaScript, введённая в ECMAScript 5, которая превращает скрытые ошибки в явные исключения и делает код надёжнее.

Что такое "use strict"

JavaScript был разработан в 1995 году с расчётом на то, чтобы никогда не «падать» из-за плохого кода — ошибки молча игнорировались ради работоспособности страниц. Такое снисходительное поведение скрывает баги. Строгий режим — это опциональный вариант языка, введённый в ECMAScript 5 (2009), который превращает многие из этих скрытых ошибок в явные и устраняет ряд запутанных устаревших возможностей.

Он включается с помощью строкового директивного пролога:

"use strict";

На этой странице рассказывается, куда помещать директиву, что именно она меняет и почему современный код (модули и классы) уже работает в строгом режиме без каких-либо дополнительных действий с вашей стороны.

Как включить строгий режим

Директива должна быть самым первым оператором — обычной строкой, до любого другого кода. Если что-то предшествует ей (даже случайное выражение), она воспринимается как обычная строка и игнорируется без каких-либо предупреждений.

Весь скрипт или модуль

Поместите "use strict"; в начало файла, чтобы применить строгий режим ко всему, что находится ниже:

"use strict";

// Every statement in this file now runs in strict mode.
function doStuff() {
  // strict here too
}

Отдельная функция

Вы можете ограничить строгий режим одной функцией, поместив директиву в начало её тела. Остальная часть файла остаётся в небрежном («нестрогом») режиме. Это удобно, когда нужно постепенно вводить строгое поведение в большом устаревшем файле — функция за функцией.

function strictFn() {
  "use strict";
  return arguments; // strict behavior, just inside here
}

function sloppyFn() {
  return arguments; // legacy behavior
}

Отключить строгий режим невозможно, как только область видимости стала строгой. Директива действует только в одну сторону.

Что именно меняет строгий режим

Различий немного, но они помогают обнаруживать настоящие ошибки. Вот те, с которыми вы будете сталкиваться чаще всего.

Присваивание необъявленной переменной выбрасывает ошибку

В небрежном режиме x = 10 без var/let/const молча создаёт глобальную переменную — классический источник утечек и опечаток. Строгий режим отклоняет это:

"use strict";
undeclaredVariable = 10; // ReferenceError: undeclaredVariable is not defined

Смотрите глобальный объект и область видимости переменных, чтобы понять, почему случайные глобальные переменные так опасны.

Неверные присваивания выбрасывают ошибку вместо тихого провала

Запись в свойство только для чтения, свойство с геттером без сеттера или нерасширяемый object в небрежном режиме завершается тихим провалом. Строгий режим выбрасывает TypeError, позволяя обнаружить проблему немедленно:

"use strict";
const obj = {};
Object.defineProperty(obj, "x", { value: 1, writable: false });
obj.x = 2; // TypeError: Cannot assign to read only property 'x'

this равно undefined при обычном вызове функции

При прямом вызове обычной функции (не как метода) небрежный режим устанавливает this равным глобальному object. Строгий режим оставляет его undefined, что обнажает ошибки, когда метод вызывается в отрыве от своего object:

"use strict";
function whoAmI() {
  return this;
}
console.log(whoAmI()); // undefined  (in sloppy mode this would be the global object)

Дублирующиеся имена параметров запрещены

"use strict";
function add(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context
  return a + a;
}

Другие ограничения

  • delete применительно к переменной, функции или аргументу функции является SyntaxError.
  • Восьмеричные литералы вида 010 запрещены (используйте 0o10).
  • eval и arguments нельзя присваивать или использовать в качестве имён переменных.
  • Зарезервированные слова вроде implements, interface, private, public нельзя использовать в качестве идентификаторов.

Модули и классы всегда работают в строгом режиме

Зачастую вам вообще не нужно писать "use strict";, потому что два наиболее распространённых современных контекста автоматически являются строгими:

  • ES-модули. Любой файл, загружаемый как модуль (<script type="module">, файл с import или файл .mjs), работает в строгом режиме. Директива там избыточна.
  • Тела классов. Весь код внутри объявления или выражения class { ... } является строгим вне зависимости от окружающего файла.
class Counter {
  // This method is strict even with no directive anywhere in the file.
  bump() {
    return this; // undefined if called detached, like any strict function
  }
}

Поэтому большинство кода, написанного сегодня, фактически уже работает в строгом режиме. Директива "use strict"; важна главным образом для классических немодульных файлов <script> и устаревших кодовых баз.

Когда использовать строгий режим

  • Новые немодульные скрипты: добавьте "use strict"; в начало. Это бесплатная страховка от случайных глобальных переменных и тихих сбоев.
  • Модули и классы: ничего делать не нужно — строгий режим уже включён.
  • Устаревшие файлы: вводите постепенно, функция за функцией, и перепроверяйте. Переключение целого небрежного файла на строгий режим может обнажить код, который тайно опирался на случайные глобальные переменные или небрежное поведение this. Смотрите старый "var" — там описано связанное устаревшее поведение, которое полезно устранить одновременно.

Резюме

Строгий режим — это более строгий и безопасный диалект JavaScript, включаемый директивой "use strict"; в начале скрипта или функции. Он блокирует неявные глобальные переменные, выбрасывает ошибки при неверных присваиваниях, устанавливает this равным undefined при обычных вызовах, а также запрещает дублирующиеся параметры и ряд устаревших синтаксических конструкций. ES-модули и тела классов включают его автоматически, поэтому основная причина писать его вручную — классические скриптовые файлы и старый код.

Практика

Практика
Что делает директива 'use strict' в JavaScript?
Что делает директива 'use strict' в JavaScript?
Was this page helpful?