07. Strict Mode

Строгий режим включается при помощи декларации 'use strict' добавляемой в начало JS файла или функции.

"use strict"

function strictFn() {
    "use strict"
    ...
}

В строгом режиме были добавлены новые ключевые слова, используемые в ES6, такие как let, implements, yield, static и др.

В ES6 весь код в модулях по умолчанию выполняется в строгом режиме. Таким образом со временем весь JS код будет работать в строгом режиме.

Языковые конструкции:

  • Не допускается использовать литералы восьмеричных целых чисел, например 00840.

  • Не допускается использование инструкции with

  • Все переменные должны объявляться. В нестрогом режиме такая попытка просто создаст новую глобальную переменную и добавит ее в виде свойства в глобальный объект.

  • Возбуждается исключение SyntaxError, если оператору delete передать неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции.

  • Код, передаваемый функции eval(), не может объявлять переменные или функции в области видимости вызывающего программного кода, как это возможно в нестрогом режиме. Вместо этого переменные и функции помещаются в новую область видимости, создаваемую для функции eval(). Эта область видимости исчезает, как только eval() вернет управление.

  • Идентификаторы eval и arguments интерпретируются как ключевые слова, и вы не можете изменить их значения.

  • Нельзя использовать новые языковые конструкции, типа protected, static, interface и т.д.

Функции:

  • Определение двух или более параметров с одинаковыми именами в объявлении функции считается синтаксической ошибкой.

  • Функции, которые вызываются как функции (а не как методы), получают в this значение undefined (в нестрогом режиме функции, которые вызываются как функции, всегда получают в ссылке this глобальный объект).

  • Объект arguments в функции хранит статическую копию значений, переданных функции. В нестрогом режиме объект arguments ведет себя иначе – элементы массива arguments и именованные параметры функции ссылаются на одни и те же значения.

  • Ограничивается возможность просмотра стека вызовов. Попытки обратиться к свойствам arguments.caller и arguments.callee в строгом режиме возбуждают исключение TypeError.

Объекты:

  • Попытки присвоить значения свойствам, недоступным для записи, или создать новые свойства в нерасширяемых объектах порождают исключение TypeError.

  • Попытка удалить ненастраиваемое свойство приведет к исключению TypeError.

  • Попытка определить в литерале объекта два или более свойств с одинаковыми именами считается синтаксической ошибкой.

Last updated