ECMAScript | Функциональные записи среды

ECMAScript | Функциональные записи среды

Запись Среды Функции (Function Environment Record) — это декларативная Запись Среды (Environment Record), которая используется для представления области видимости верхнего уровня функции и, если функция не является стрелочной функцией — ArrowFunction, предоставляет привязку this. Если функция не является стрелочной функцией ArrowFunction и ссылается на super, ее Запись Среды Функции также содержит состояние, которое используется для выполнения вызовов super метода изнутри функции.

 
Записи Среды Функции содержат дополнительные поля состояния, перечисленные в Таблице 19.

Имя поля Значение Смысл
[[ThisValue]] Любое Это значение this, используемое для этого вызова функции.
[[ThisBindingStatus]] lexical | initialized | uninitialized Если значение лексическое lexical, это стрелочная функция ArrowFunction и не имеет локального значения this.
[[FunctionObject]] Object Функциональный объект, вызов которого вызвал создание этой Записи Среды.
[[FunctionObject]] Object | undefined Если эта Запись Среды была создана внутренним методом [[Construct]], [[NewTarget]] является значением параметра [[Construct]] newTarget. В противном случае его значение не определено — является undefined.

Таблица 19: Дополнительные поля записей среды функций

Записи Среды Функции (Function Environment Record) поддерживают все методы декларативной записи среды, перечисленные в таблице 17, и имеют одинаковые спецификации для всех этих методов, за исключением HasThisBinding и HasSuperBinding. Кроме того, Записи Среды Функции поддерживает методы, перечисленные в таблице 20:

Метод Цель
BindThisValue(V) Установите [[ThisValue]] и запишите, что оно было инициализировано.
GetThisBinding() Вернуть значение привязки Записи Среды этого this. Выдает ошибку ReferenceError, если привязка this не была инициализирована.
GetSuperBase() Верните объект, который является базой для доступа к свойству super, привязанным в этой Записи Среды. Значение undefined указывает, что доступ к super приведет к ошибкам выполнения.

Таблица 20: Дополнительные методы записей среды функций

 
Поведение дополнительных методов конкретной спецификации для Записи Среды Функции (Function Environment Record) определяется следующими алгоритмами:

BindThisValue ( V )

Конкретный метод BindThisValue (Привязать значение this), Записи Среды Функции envRec принимает аргумент V (значение языка ECMAScript). При вызове он выполняет следующие шаги:

1. Утверждено: envRec.[[ThisBindingStatus]] не является lexical.
2. Если envRec.[[ThisBindingStatus]] является initialized, выбросить исключение ReferenceError.
3. Установить envRec.[[ThisValue]] на V.
4. Установить envRec.[[ThisBindingStatus]] на initialized.
5. Вернуть V.

 

HasThisBinding ( )

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

1. Если envRec.[[ThisBindingStatus]] является lexical, вернуть false; иначе, вернуть true.

 

HasSuperBinding ( )

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

1. Если envRec.[[ThisBindingStatus]] является lexical, вернуть false.
2. Если envRec.[[FunctionObject]].[[HomeObject]] имеет значение undefined, вернуть false; в противном случае верните true.

 

GetThisBinding ( )

Конкретный метод GetThisBinding (Получить привязку this), Записи Среды Функции envRec не принимает аргументов. При вызове он выполняет следующие шаги:

1. Утверждено: envRec.[[ThisBindingStatus]] не является lexical.
2. Если envRec.[[ThisBindingStatus]] является uninitialized, выбросить исключение ReferenceError.
3. Вернуть envRec.[[ThisValue]].

 

GetSuperBase ( )

Конкретный метод GetSuperBase (Получить основу super), Записи Среды Функции envRec не принимает аргументов. При вызове он выполняет следующие шаги:

1. Пусть home будет envRec.[[FunctionObject]].[[HomeObject]].
2. Если home имеет значение undefined, верните undefined.
3. Утверждено: Type(home) является Object.
4. Вернуть ? home.[[GetPrototypeOf]]().

 

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

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

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

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