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