Запись Среды Функции (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 — Раздел «9.1.1.3 Function Environment Records» — https://tc39.es/ecma262/#sec-function-environment-records