ECMAScript | Глобальные записи среды

Глобальная запись среды (global Environment Record) используется для представления самой внешней области видимости (outer most scope), которая используется всеми элементами сценария ECMAScript, которые обрабатываются в общей области (common realm). Глобальная запись среды предоставляет привязки для встроенных глобальных объектов (раздел 19), свойств глобального объекта и для всех объявлений верхнего уровня (8.1.9, 8.1.11), которые происходят в сценарии.

Глобальная запись среды логически представляет собой отдельную запись, но она определяется как составная, инкапсулирующая объектную запись среды (object Environment Record) и декларативную запись среды (declarative Environment Record). Объектная запись среды имеет в качестве базового объекта глобальный объект связанной записью области (Realm Record). Этот глобальный объект является значением, возвращаемым конкретным методом GetThisBinding глобальной записи среды. Компонент Объектной запись среды для глобальной записи среды содержит привязки для всех встроенных глобальных переменных (раздел 19) и всех привязок, представленных FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration или VariableStatement, содержащимися в глобальном коде. Привязки для всех других объявлений ECMAScript в глобальном коде содержатся в компоненте декларативной записи среды (declarative Environment Record) для глобальной записи среды.


Свойства могут быть созданы непосредственно на глобальном объекте. Следовательно, компонент записи среды объекта глобальной записи среды может содержать как привязки, созданные явно с помощью FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, или VariableDeclaration, объявления и привязки, созданные неявно как свойства глобального объекта. Чтобы определить, какие привязки были явно созданы с помощью объявлений, глобальная запись среды поддерживает список имен, связанных с помощью конкретных методов CreateGlobalVarBinding и CreateGlobalFunctionBinding.

В Global Environment Records есть дополнительные поля, перечисленные в Таблице 21, и дополнительные методы, перечисленные в Таблице 22.

Имя поля Значение Смысл
[[ObjectRecord]] Object Environment Record Объект привязки — это глобальный объект. Он содержит глобальные встроенные привязки, а также привязки FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration и VariableDeclaration в глобальном коде для связанной области (realm).
[[GlobalThisValue]] Object Значение, возвращаемое этим this в глобальной области видимости (scope). Хосты могут предоставлять любое значение объекта ECMAScript.
[[DeclarativeRecord]] Declarative Environment Record Содержит привязки для всех объявлений в глобальном коде для связанного кода области (realm), за исключением привязок FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration и VariableDeclaration.
[[VarNames]] List of String Имена строк, связанные объявлениями FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration и VariableDeclaration в глобальном коде для связанной области (realm).

Таблица 21: Дополнительные поля глобальных записей среды

 

Метод Цель
GetThisBinding() Вернуть значение привязки this Environment Record (записи среды this).
HasVarDeclaration (N) Определяет, имеет ли идентификатор аргумента привязку в этой записи среды, которая была создана с помощью VariableDeclaration, FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration или AsyncGeneratorDeclaration.
HasLexicalDeclaration (N) Определяет, имеет ли идентификатор аргумента привязку в этой записи среды, которая была создана с использованием лексического объявления, такого как LexicalDeclaration или ClassDeclaration.
HasRestrictedGlobalProperty (N) Определяет, является ли аргумент именем свойства глобального объекта, которое не может быть затенено глобальной лексической привязкой.
CanDeclareGlobalVar (N) Определяет, будет ли успешным соответствующий вызов CreateGlobalVarBinding, если он вызван для того же аргумента N.
CanDeclareGlobalFunction (N) Определяет, будет ли успешным соответствующий вызов CreateGlobalFunctionBinding, если он вызван для того же аргумента N.
CreateGlobalVarBinding(N, D) Используется для создания и инициализации undefined глобальной привязки var в компоненте [[ObjectRecord]] глобальной записи среды. Привязка будет изменяемой привязкой. Соответствующее свойство глобального объекта будет иметь значения атрибутов, соответствующие var. Строковое значение N — это связанное имя. Если D истинно true, привязка может быть удалена. Логически эквивалентен CreateMutableBinding, за которым следует SetMutableBinding, но позволяет объявлениям var получать особую обработку.
CreateGlobalFunctionBinding(N, V, D) Создаёт и инициализирует привязку глобальной функции function в компоненте [[ObjectRecord]] глобальной записи среды. Привязка будет изменяемой привязкой. Соответствующее свойство глобального объекта будет иметь значения атрибутов, подходящие для функции function. Строковое значение N — это связанное имя. V — значение инициализации. Если логический аргумент D истинен true, привязка может быть удалена. Логически эквивалентен CreateMutableBinding, за которым следует SetMutableBinding, но позволяет объявлениям функций получать особую обработку.

Таблица 22: Дополнительные методы глобальных записей среды

 

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

HasBinding ( N )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) истинно true, вернуть истину true.
3. Пусть ObjRec будет envRec.[[ObjectRecord]].
4. Вернуть ? ObjRec.HasBinding(N).

 

CreateMutableBinding ( N, D )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) истинно true, выбросить исключение TypeError.
3. Верните DclRec.CreateMutableBinding(N, D).

 

CreateImmutableBinding ( N, S )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) является true, выбросить исключение TypeError.
3. Вернуть DclRec.CreateImmutableBinding(N, S).

 

InitializeBinding ( N, V )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) является true, тогда
   a. Вернуть DclRec.InitializeBinding(N, V).
3. Утверждено: Если привязка существует, она должна быть в Объектной Записи Среды.
4. Пусть ObjRec будет envRec.[[ObjectRecord]].
5. Вернуть ? ObjRec.InitializeBinding(N, V).

 

SetMutableBinding ( N, V, S )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) является true, тогда
   a. Вернуть DclRec.SetMutableBinding(N, V, S).
3. Пусть ObjRec будет envRec.[[ObjectRecord]].
4. Вернуть ? ObjRec.SetMutableBinding(N, V, S).

 

GetBindingValue ( N, S )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) является true, тогда
   a. Вернуть DclRec.GetBindingValue(N, S).
3. Пусть ObjRec будет envRec.[[ObjectRecord]].
4. Вернуть ? ObjRec.GetBindingValue(N, S).

 

DeleteBinding ( N )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Если DclRec.HasBinding(N) является true, тогда
   a. Вернуть DclRec.DeleteBinding(N).
3. Пусть ObjRec будет envRec.[[ObjectRecord]].
4. Пусть globalObject будет ObjRec.[[BindingObject]].
5. Пусть existingProp будет ? HasOwnProperty(globalObject, N).
6. Если existingProp является true, тогда
   a. Пусть status будет ? ObjRec.DeleteBinding(N).
   b. Если status является true, тогда
      i. Пусть varNames будет envRec.[[VarNames]].
      ii. Если N является элементом varNames, удалите этот элемент из varNames.
   c. Вернуть status.
7. Вернуть true.

 

HasThisBinding ( )

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

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

«Global Environment Records» (Глобальная Запись Среды) всегда предоставляют привязку this.

 

HasSuperBinding ( )

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

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

«Global Environment Records» не имеют привязки super.

 

WithBaseObject ( )

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

1. Вернуть undefined.

 

GetThisBinding ( )

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

1. Вернуть envRec.[[GlobalThisValue]].

 

HasVarDeclaration ( N )

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

1. Пусть varDeclaredNames будет envRec.[[VarNames]].
2. Если varDeclaredNames содержит N, вернуть true.
3. Вернуть false.

 

HasLexicalDeclaration ( N )

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

1. Пусть DclRec будет envRec.[[DeclarativeRecord]].
2. Вернуть DclRec.HasBinding(N).

 

HasRestrictedGlobalProperty ( N )

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

1. Пусть ObjRec будет envRec.[[ObjectRecord]].
2. Пусть globalObject будет ObjRec.[[BindingObject]].
3. Пусть existingProp будет ? globalObject.[[GetOwnProperty]](N).
4. Если existingProp является undefined, вернуть false.
5. Если existingProp.[[Configurable]] является true, вернуть false.
6. Вернуть true.
Примечание

Свойства могут существовать в глобальном объекте, который был создан напрямую, а не объявлен с помощью объявления var или функции. Нельзя создать глобальную лексическую привязку, имя которой совпадает с именем ненастраиваемого свойства глобального объекта. Глобальное свойство undefined является примером такого свойства.

 

CanDeclareGlobalVar ( N )

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

1. Пусть ObjRec будет envRec.[[ObjectRecord]].
2. Пусть globalObject будет ObjRec.[[BindingObject]].
3. Пусть hasProperty будет ? HasOwnProperty(globalObject, N).
4. Если hasProperty является true, вернуть true.
5. Вернуть ? IsExtensible(globalObject).

 

CanDeclareGlobalFunction ( N )

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

1. Пусть ObjRec будет envRec.[[ObjectRecord]].
2. Пусть globalObject будет ObjRec.[[BindingObject]].
3. Пусть existingProp будет ? globalObject.[[GetOwnProperty]](N).
4. Если existingProp является undefined, вернуть ? IsExtensible(globalObject).
5. Если existingProp.[[Configurable]] является true, вернуть true.
6. Если IsDataDescriptor(existingProp) является true и existingProp имеет значения атрибута { [[Writable]]: true, [[Enumerable]]: true }, вернуть true.
7. Вернуть false.

 

CreateGlobalVarBinding ( N, D )

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

1. Пусть ObjRec будет envRec.[[ObjectRecord]].
2. Пусть globalObject будет ObjRec.[[BindingObject]].
3. Пусть hasProperty будет ? HasOwnProperty(globalObject, N).
4. Пусть extensible будет ? IsExtensible(globalObject).
5. Если hasProperty является false и extensible является true, тогда
   a. Выполнить ? ObjRec.CreateMutableBinding(N, D).
   b. Выполнить ? ObjRec.InitializeBinding(N, undefined).
6. Пусть varDeclaredNames будет envRec.[[VarNames]].
7. Если varDeclaredNames не содержит N, то
   a. Добавьте N к varDeclaredNames.
8. Вернуть NormalCompletion(empty).

 

CreateGlobalFunctionBinding ( N, V, D )

Конкретный метод CreateGlobalFunctionBinding (Создать привязку глобальной функции), глобальной записи среды envRec принимает аргументы N (строка), V (значение языка ECMAScript) и D (логическое значение). Он создает и инициализирует изменяемую привязку в связанной записи среды объекта и записывает связанное имя в связанный список [[VarNames]]. Если привязка уже существует, она заменяется. При вызове он выполняет следующие шаги:

1. Пусть ObjRec будет envRec.[[ObjectRecord]].
2. Пусть globalObject будет ObjRec.[[BindingObject]].
3. Пусть existingProp будет ? globalObject.[[GetOwnProperty]](N).
4. Если existingProp является undefined или existingProp.[[Configurable]] имеет значение true, то
   a. Пусть desc будет PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }.
5. Иначе,
   a. Пусть desc будет PropertyDescriptor { [[Value]]: V }.
6. Выполнить ? DefinePropertyOrThrow(globalObject, N, desc).
7. Выполнить ? Set(globalObject, N, V, false).
8. Пусть varDeclaredNames будет envRec.[[VarNames]].
9. Если varDeclaredNames не содержит N, то
   a. Добавить N к varDeclaredNames.
10. Вернуть NormalCompletion(empty).
Примечание

Объявления глобальных функций всегда представлены как собственные свойства глобального объекта. Если возможно, существующее собственное свойство реконфигурируется, чтобы иметь стандартный набор значений атрибутов. Шаг 7 эквивалентен вызову конкретного метода InitializeBinding, и если globalObject является Proxy, будет создана такая же последовательность вызовов ловушки Proxy.

 

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

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

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

Стандарт ECMAScript — Раздел «9.1.1.4 Global Environment Records» — https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-global-environment-records

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