Для чего используется директива «use strict»?
Директива "use strict" используется в JavaScript для включения строгого режима интерпретации кода. Это специальная инструкция, которую можно поместить в начало скрипта или функции, чтобы перевести выполнение кода в строгий режим (strict mode), введённый в стандарте ECMAScript 5 (ES5).
Строгий режим позволяет писать более безопасный, предсказуемый и оптимизируемый код, устраняя некоторые неочевидные особенности и опасные конструкции JavaScript. Он активирует жёсткие правила проверки и вызывает ошибки там, где в обычном режиме они могли бы быть проигнорированы.
1. Синтаксис подключения
"use strict";
Директива должна быть первой строкой в скрипте или теле функции. Если её поставить позже — она будет проигнорирована.
Пример для всего файла:
"use strict";
var x = 3.14;
Пример только для функции:
function myFunction() {
"use strict";
var y = 3.14;
}
Важно: если строгий режим включён в теле функции, он не распространяется на внешний код.
2. Запрещает неявное объявление переменных
В обычном режиме, если присвоить значение несуществующей переменной, JavaScript не выдаст ошибку, а создаст глобальную переменную неявно:
x = 10; // создаётся глобальная переменная
В строгом режиме это вызовет ReferenceError:
"use strict";
x = 10; // ReferenceError: x is not defined
Это предотвращает случайные ошибки при опечатках и помогает избегать загрязнения глобальной области.
3. Запрещает дублирование имён параметров функции
В нестрогом режиме можно было использовать одинаковые имена параметров:
function sum(a, a, c) {
return a + c;
}
В строгом режиме это вызовет SyntaxError:
"use strict";
function sum(a, a, c) {
// SyntaxError: Duplicate parameter name not allowed
}
Это улучшает читаемость и предотвращает конфликты между параметрами.
4. Запрещает использование некоторых зарезервированных слов
Строгий режим запрещает использовать зарезервированные имена, которые могут быть добавлены в будущем стандартами ECMAScript:
"use strict";
var public = 1; // SyntaxError
var interface = 2; // SyntaxError
Примеры зарезервированных слов: implements, interface, let, package, private, protected, public, static, yield.
5. Ограничивает использование this
В обычном режиме, при вызове функции без контекста, this указывает на глобальный объект (window в браузере, global в Node.js):
function f() {
console.log(this); // window
}
f();
В строгом режиме this становится undefined, что предотвращает непреднамеренный доступ к глобальному объекту:
"use strict";
function f() {
console.log(this); // undefined
}
f();
Это особенно важно для безопасности и чистоты контекста.
6. Запрещает удаление необъявляемых или защищённых свойств
В обычном режиме delete может быть вызван на переменной или свойстве объекта:
delete x; // не вызывает ошибку
В строгом режиме попытка удалить переменную, функцию или аргумент — **ошибка**:
"use strict";
var x = 1;
delete x; // SyntaxError
Также нельзя удалить arguments или eval.
7. Запрещает присвоение значения eval и arguments
Нельзя использовать eval и arguments в качестве имён переменных, параметров или функций:
"use strict";
var eval = 5; // SyntaxError
var arguments = 10; // SyntaxError
function test(arguments) {} // SyntaxError
Это сделано для того, чтобы избежать путаницы с одноимёнными встроенными механизмами.
8. Изменяется поведение функции eval()
eval() в строгом режиме создаёт переменные в своей локальной области видимости, а не в окружающей.
Нестрогий режим:
eval("var a = 5;");
console.log(a); // 5
Строгий режим:
"use strict";
eval("var b = 10;");
console.log(b); // ReferenceError: b is not defined
Это изолирует код, выполняемый через eval, делая его менее опасным.
9. Запрещает изменения объектов arguments и caller у функций
В обычном режиме функция имеет свойства arguments.callee и arguments.caller, которые можно использовать для доступа к вызывающей функции или самой функции. В строгом режиме — это запрещено:
"use strict";
function f() {
console.log(f.caller); // TypeError
}
Также нельзя изменять объект arguments, если используется use strict:
"use strict";
function f(a) {
a = 10;
console.log(arguments\[0\]); // 5, не 10
}
f(5);
В обычном режиме arguments[0] и a связаны. В строгом — нет.
10. Запрещает создание свойств объектов на уровне литерала с дубликатами имён
В обычном режиме такой код допустим:
var obj = {
a: 1,
a: 2
};
В строгом режиме это вызовет SyntaxError:
"use strict";
var obj = {
a: 1,
a: 2 // SyntaxError: Duplicate data property
};
Это предотвращает случайное переопределение свойств.
11. Запрещает писать в только для чтения свойства и нерасширяемые объекты
Если объект помечен как non-writable или non-extensible, то строгий режим вызовет ошибку при попытке изменить или добавить свойства:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", { value: 42, writable: false });
obj.x = 9; // TypeError
В обычном режиме ошибка игнорируется, значение не меняется, но никакого уведомления не происходит.
12. Запрещает присвоение значения геттеру без сеттера
Если в объекте есть только геттер (get), но нет сеттера (set), строгий режим запрещает попытку присвоения:
"use strict";
var obj = {
get x() { return 42; }
};
obj.x = 10; // TypeError
В обычном режиме это будет проигнорировано.
13. Поддержка строгого режима в модулях и классовом синтаксисе
Современные JavaScript-модули (import/export) и классы всегда работают в строгом режиме по умолчанию, даже если явно не указать "use strict".
// Модуль JS (например, через <script type="module"> или .mjs файл)
// Код работает в строгом режиме автоматически
Также весь код внутри классов (class) автоматически исполняется строго.
14. Влияние на производительность
Хотя сам по себе строгий режим не делает код быстрее, он помогает движку JavaScript (V8, SpiderMonkey, Chakra и др.) лучше оптимизировать код, за счёт отказа от устаревших и непредсказуемых конструкций.
Например:
-
Строгий код не создаёт неявные глобальные переменные.
-
Нет перекрытия arguments и параметров.
-
Уменьшается количество скрытых путей исполнения.
Это даёт движку больше возможностей для компиляции и оптимизации JIT (Just-In-Time).