ECMAScript | Декларативные записи среды

Каждая декларативная запись среды (declarative Environment Record) связана с областью видимости (scope) программы ECMAScript, содержащей объявления:

  • переменных (variable),
  • констант (constant),
  • пусть (let),
  • классов (class),
  • модулей (module),
  • импорта (import)
  • и/или функций (function).

Декларативная запись среды связывает набор идентификаторов, определенных декларациями, содержащимися в ее области видимости.

Поведение конкретных методов спецификации для декларативных записей среды определяется следующими алгоритмами.

HasBinding ( N )

Конкретный метод HasBinding (Имеет привязку), декларативной записи среды envRec принимает аргумент N (строку). Он определяет, является ли идентификатор аргумента одним из идентификаторов, связанных с записью. При вызове он выполняет следующие шаги:

1. Если envRec имеет привязку для имени, которое является значением N, верните true.
2. Вернуть false.

 

CreateMutableBinding ( N, D )

Конкретный метод CreateMutableBinding (Создать изменяемую привязку), декларативной записи среды envRec принимает аргументы N (строка) и D (логическое значение). Он создает новую изменяемую привязку для неинициализированного имени N. Привязка не должна еще существовать в этой записи среды для N. Если D имеет значение true, новая привязка помечается как подлежащая удалению. При вызове он выполняет следующие шаги:

1. Утверждено: envRec еще не имеет привязки для N.
2. Создайте изменяемую привязку в envRec для N и запишите, что она не инициализирована. Если D истинно true, запишите, что вновь созданная привязка может быть удалена последующим вызовом DeleteBinding.
3. Вернуть NormalCompletion(empty).

 

CreateImmutableBinding ( N, S )

Конкретный метод CreateImmutableBinding (Создать неизменяемую привязку), декларативной записи среды envRec принимает аргументы N (строка) и S (логическое значение). Он создает новую неизменяемую привязку для неинициализированного имени N. Привязка не должна еще существовать в этой записи среды для N. Если S имеет значение true, новая привязка помечается как строгая привязка. При вызове он выполняет следующие шаги:

1. Утверждено: envRec еще не имеет привязки для N.
2. Создайте неизменяемую привязку в envRec для N и запишите, что она не инициализирована. Если S - истина true, запишите, что вновь созданная привязка является строгой привязкой.
3. Верните NormalCompletion(empty).

 

InitializeBinding ( N, V )

Конкретный метод InitializeBinding (Инициализировать привязку), декларативной записи среды envRec принимает аргументы N (строка) и V (значение языка ECMAScript). Он используется для установки связанного значения текущей привязки идентификатора, имя которого является значением аргумента N, на значение аргумента V. Неинициализированная привязка для N уже должна существовать. При вызове он выполняет следующие шаги:

1. Утверждено: envRec должен иметь неинициализированную привязку для N.
2. Установите граничное значение для N в envRec равным V.
3. Запишите, что привязка для N в envRec была инициализирована.
4. Верните NormalCompletion(empty).

 

SetMutableBinding ( N, V, S )

Конкретный метод SetMutableBinding (Установить изменяемую привязку), декларативной записи среды envRec принимает аргументы N (строка), V (значение языка ECMAScript) и S (логическое значение). Он пытается изменить связанное значение текущей привязки идентификатора, имя которого является значением аргумента N, на значение аргумента V. Обычно привязка для N уже существует, но в редких случаях может и не существовать. Если привязка является неизменной привязкой, выдается ошибка TypeError, если S имеет значение true. При вызове он выполняет следующие шаги:

1. Если envRec не имеет привязки для N, тогда
   а. Если S истинно true, выбросить исключение ReferenceError.
   b. Выполните envRec.CreateMutableBinding(N, true).
   c. Выполните envRec.InitializeBinding(N, V).
   d. Вернуть NormalCompletion(empty).
2. Если привязка для N в envRec является строгой привязкой, установите для S значение true.
3. Если привязка для N в envRec еще не инициализирована, вызовите исключение ReferenceError.
4. В противном случае, если привязка для N в envRec является изменяемой привязкой, измените ее значение привязки на V.
5. Иначе,
   a. Утверждено: это попытка изменить значение неизменяемой привязки.
   b. Если S истинно true, выбросить исключение TypeError.
6. Верните NormalCompletion(empty).
Примечание

Пример кода ECMAScript, который приводит к отсутствию привязки на шаге 1:

function f() { eval("var x; x = (delete x, 0);"); }

GetBindingValue ( N, S )

Конкретный метод GetBindingValue (Получить значение привязки), декларативной записи среды envRec принимает аргументы N (строка) и S (логическое значение). Он возвращает значение связанного идентификатора, имя которого является значением аргумента N. Если привязка существует, но не инициализирована, выдается ошибка ReferenceError, независимо от значения S. При вызове выполняется следующие шаги:

1. Утверждено: envRec имеет привязку к N.
2. Если привязка для N в envRec является неинициализированной привязкой, вызовите исключение ReferenceError.
3. Верните значение, привязанное к N в envRec.

 

DeleteBinding ( N )

Конкретный метод DeleteBinding (Удалить привязку), декларативной записи среды envRec принимает аргумент N (строку). Он может удалять только привязки, которые были явно обозначены как подлежащие удалению. При вызове он выполняет следующие шаги:

1. Утверждено: envRec имеет привязку к имени, которое является значением N.
2. Если привязку для N в envRec нельзя удалить, верните false.
3. Удалите привязку для N из envRec.
4. Вернуть истину true.

 

HasThisBinding ( )

Конкретный метод HasThisBinding (Имеет привязку this), декларативной записи окружения envRec не принимает аргументов. При вызове он выполняет следующие шаги:

1. Вернуть false.
Примечание

Обычная декларативная запись среды (т.е. та, которая не является ни записью среды функции, ни записью среды модуля) не обеспечивает привязку this.

 

HasSuperBinding ( )

Конкретный метод HasSuperBinding (Имеет привязку super), декларативной записи среды envRec не принимает аргументов. При вызове он выполняет следующие шаги:

1. Вернуть false.
Примечание

Обычная декларативная запись среды (т.е. та, которая не является ни записью среды функции, ни записью среды модуля) не обеспечивает привязку super.

 

WithBaseObject ( )

Конкретный метод WithBaseObject (С базовым объектом), декларативной записи среды envRec не принимает аргументов. При вызове он выполняет следующие шаги:

1. Вернуть undefined.

 

Информационные ссылки

ECMAScript | Записи среды

ECMAScript | Иерархия типов записей среды

Стандарт ECMAScript — Раздел «9.1.1.1 Declarative Environment Records» — https://tc39.es/ecma262/#sec-declarative-environment-records

 

Поделись записью