JavaScript строгий режим (strict mode)
Строгий режим (strict mode) — это модель синтаксического анализа и выполнения JavaScript-кода, в которой устранены важные языковые недостатки, а также обеспечены более строгая проверка ошибок и увеличенная безопасность.
Включение строгого режима
Чтобы включить строгий режим для всего скрипта, добавьте в начало скрипта следующую команду:
"use strict";
Хоть она и выглядит как строка, на самом деле это директива, переводящая JavaScript в строгий режим.
Строгий режим можно включить и для отдельной функции, добавив эту директиву в начало тела функции:
function foo() {
"use strict";
}
Директиву "use strict"
можно указывать только в начале сценария или тела функции. Это не означает, что она должна находиться именно в самой первой строке, но должна быть указана до каких-либо других инструкций. Если директиву "use strict"
указать не в начале, а в другом месте, она не будет работать:
"use strict"; // Правильное расположение
a = 5; // Ошибка — необъявленная переменная
alert(a);
a = 5;
alert(a);
// Неправильное расположение. Директива не будет работать
"use strict";
b = 1;
alert(b);
Любой код в теле класса или в модуле автоматически становится строгим.
Выполнение JavaScript в строгом режиме
Ниже объясняются отличия между строгим и нестрогим режимами.
- В строгом режиме все переменные перед их использованием должны быть объявлены. Попытка использовать переменную до объявления вызывает исключение. (В нестрогом режиме просто неявно объявляется глобальная переменная путём добавления нового свойства к глобальному объекту).
- В строгом режиме нельзя использовать в качестве идентификаторов слова
eval
иarguments
. (В нестрогом режиме — можно). - В строгом режиме попытка добавить новое свойство примитивному значению вызывает исключение. (В нестрогом режиме — нет).
- В строгом режиме нельзя использовать инструкцию
with
. (В нестрогом режиме — можно). - В строгом режиме наличие в объявлении функции параметров с одинаковыми именами генерирует возникновение ошибки. (В нестрогом режиме ошибка не возникает).
- В строгом режиме параметры функции не синхронизируются со значениями объекта
arguments
. (В нестрогом режиме объектarguments
и параметры функции ссылаются на то же самое значение). - В строгом режиме функция, вызываемая как функция (а не как метод), имеет значение
this
, равноеundefined
. (В нестрогом режиме значениемthis
является ссылка на глобальный объект). - В строгом режиме переменные и функции, создаваемые в переданном
eval()
коде, недоступны в области видимости вызывающего кода:
(В нестрогом режиме в переданном"use strict"; let a = 10; eval("let x = 10; alert(x + a);"); alert(x); // Ошибка. Переменной x не существует
eval()
коде переменные, объявленные с помощью ключевого словаvar
, и функции, доступны в области видимости вызывающего кода). - В строгом режиме операндом оператора
delete
может быть только конфигурируемое свойство объекта или элемент массива, в противном случае генерируется ошибка. (В нестрогом режиме операторdelete
с неподходящим операндом вычисляется какfalse
и больше ничего не делает). - В строгом режиме попытка присвоить значение свойству, недоступному для записи, или создание нового свойства в не допускающем расширение объекте вызывают исключение. (В нестрогом режиме такие попытки молча терпят неудачу).
- В строгом режиме обращение к свойствам
arguments.caller
иarguments.callee
приводит к генерации ошибки. (В нестрогом режиме — нет). - В строгом режиме функции, объявленные внутри блока, находятся в блочной области видимости:
(В нестрогом режиме функция объявляется в глобальной области видимости)."use strict"; { foo(); // 1 function foo () { alert(1); } } foo(); // Ошибка. Функция foo не объявлена.