ECMAScript | Объектные записи среды

Каждая Объектная запись среды (object Environment Record) связана с объектом, который называется его связывающим объектом (binding object). Объектная запись среды связывает набор имен строковых идентификаторов, которые напрямую соответствуют именам свойств его связывающего объекта. Ключи свойств, которые не являются строками в форме IdentifierName, не включаются в набор связанных идентификаторов. В набор включаются как собственные, так и унаследованные свойства независимо от настройки их атрибута [[Enumerable]]. Поскольку свойства могут быть динамически добавлены и удалены из объектов, набор идентификаторов, связанных с Объектной записью среды, может потенциально измениться как побочный эффект любой операции, которая добавляет или удаляет свойства. Любые привязки, созданные в результате такого побочного эффекта, считаются изменяемыми привязками, даже если атрибут Writable соответствующего свойства имеет значение false. Неизменяемые привязки не существуют для записей среды объекта.


Записи среды объекта, созданные для операторов with (14.11), могут предоставлять свой объект привязки как неявное значение this для использования в вызовах функций. Возможность управляется логическим полем [[IsWithEnvironment]].

В Записях среды объекта есть дополнительные поля состояния, перечисленные в таблице 18.

Имя поля Значение Смысл
[[BindingObject]] Object Связывающий объект этой записи среды.
[[IsWithEnvironment]] Boolean Указывает, создана ли эта запись среды для оператора with.

Таблица 18: Дополнительные поля Записи среды объекта

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

HasBinding ( N )

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

1. Пусть bindingObject будет envRec.[[BindingObject]].
2. Пусть foundBinding будет ? HasProperty(bindingObject, N).
3. Если foundBinding имеет значение false, вернуть false.
4. Если envRec.[[IsWithEnvironment]] ложно false, вернуть истину true.
5. Пусть unscopables будет ? Get(bindingObject@@unscopables).
6. Если Type(unscopables) явояется Object, то
   a. Пусть blocked будет ! ToBoolean(? Get(unscopablesN)).
   b. Если blocked является true, вернуть false.
7. Вернуть истину true.

 

CreateMutableBinding ( N, D )

Конкретный метод CreateMutableBinding (Создать изменяемую привязку), Записи среды объекта envRec принимает аргументы N (строка) и D (логическое значение). Он создает в связанном объекте привязки записи среды свойство, имя которого является значением String, и инициализирует его значением undefined. Если D имеет значение true, атрибут [[Configurable]] нового свойства устанавливается в значение true; в противном случае устанавливается значение false. При вызове он выполняет следующие шаги:

1. Пусть bindingObject будет envRec.[[BindingObject]].
2. Вернуть ? DefinePropertyOrThrow(bindingObject, N, PropertyDescriptor {[[Значение]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D}).
Примечание

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

 

CreateImmutableBinding ( N, S )

Конкретный метод CreateImmutableBinding (Создать неизменяемую привязку), Записи среды объекта никогда не используется в этой спецификации.

 

InitializeBinding ( N, V )

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

1. DВернуть ? envRec.SetMutableBinding(N, V, false).
Примечание

В этой спецификации за всем использованием CreateMutableBinding для объектных записей среды сразу следует вызов InitializeBinding с тем же именем. Следовательно, эта спецификация не отслеживает явно состояние инициализации привязок в записях среды объекта.

 

SetMutableBinding ( N, V, S )

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

1. Пусть bindingObject будет envRec.[[BindingObject]].
2. Пусть stillExists будет ? HasProperty(bindingObject, N).
3. Если stillExists имеет значение false, а S равно true, выбросить исключение ReferenceError.
4. Вернуть ? Set(bindingObject, N, V, S).

 

GetBindingValue ( N, S )

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

1. Пусть bindingObject будет envRec.[[BindingObject]].
2. Пусть value будет ? HasProperty(bindingObject, N).
3. Если value является false, то
   a. Если S ложно, вернуть значение undefined; в противном случае выбросить исключение ReferenceError.
4. Вернуть ? Get(bindingObject, N).

 

DeleteBinding ( N )

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

1. Пусть bindingObject будет envRec.[[BindingObject]].
2. Вернуть ? bindingObject.[[Delete]](N).

 

HasThisBinding ( )

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

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

Записи среды объекта не имеют привязки this.

 

HasSuperBinding ( )

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

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

Записи среды объекта не обеспечивают привязку super.

 

WithBaseObject ( )

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

1. Если envRec.[[IsWithEnvironment]] истинно true, вернуть envRec.[[BindingObject]].
2. В противном случае вернуть undefined.

 

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

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

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

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

 

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