Следующие абстрактные операции используются в этой спецификации для работы с записями среды:
- GetIdentifierReference ( env, name, strict )
- NewDeclarativeEnvironment ( E )
- NewObjectEnvironment ( O, W, E )
- NewFunctionEnvironment ( F, newTarget )
- NewGlobalEnvironment ( G, thisValue )
- NewModuleEnvironment ( E )
GetIdentifierReference ( env, name, strict )
Абстрактная операция GetIdentifierReference (Получить ссылку на идентификатор) принимает аргументы env (Запись Среды или null), name (строка) и strict (логическое значение). При вызове он выполняет следующие шаги:
1. Если env имеет значение null, тогда a. Вернуть Ссылочную Запись {[[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty} ". 2. Пусть exists будет ? env.HasBinding(name). 3. Если exists верно true, то a. Вернуть Ссылочную Запись {[[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty} ". 4. Иначе, a. Пусть outer будет env.[[OuterEnv]]. b. Возвращаться ? GetIdentifierReference(outer, name, strict).
NewDeclarativeEnvironment ( E )
Абстрактная операция NewDeclarativeEnvironment (Новая декларативная среда) принимает аргумент E (Запись Среды). При вызове он выполняет следующие шаги:
1. Пусть env будет новой декларативной записью среды, не содержащей привязок. 2. Установите env.[[OuterEnv]] на E. 3. Вернуть env.
NewObjectEnvironment ( O, W, E )
Абстрактная операция NewObjectEnvironment (Новая объектная среда) принимает аргументы O (объект), W (логическое значение) и E (Запись Среды или значение null). При вызове он выполняет следующие шаги:
1. Пусть env будет новой объектной записью среды. 2. Установите для env.[[BindingObject]] значение O. 3. Установите для env.[[IsWithEnvironment]] значение W. 4. Установите env.[[OuterEnv]] на E. 5. Вернуть env.
NewFunctionEnvironment ( F, newTarget )
Абстрактная операция NewFunctionEnvironment (Новая функциональная среда) принимает аргументы F и newTarget. При вызове он выполняет следующие шаги:
1. Утверждено: F является функцией ECMAScript. 2. Утверждено: Тип(newTarget) является Undefined или Object. 3. Пусть env будет новой функциональной записью среды, не содержащей привязок. 4. Установите для env.[[FunctionObject]] значение F. 5. Если F.[[ThisMode]] является lexical (лексическим), установите env.[[ThisBindingStatus]] в lexical. 6. В противном случае установите для env.[[ThisBindingStatus]] значение uninitialized (неинициализированное). 7. Установите для env.[[NewTarget]] значение newTarget. 8. Установите для env.[[OuterEnv]] значение F.[[Environment]]. 9. Вернуть env.
NewGlobalEnvironment ( G, thisValue )
Абстрактная операция NewGlobalEnvironment (Новая глобальная среда) принимает аргументы G и thisValue. При вызове он выполняет следующие шаги:
1. Пусть objRec будет NewObjectEnvironment(G, false, null). 2. Пусть dclRec будет новой декларативной записью среды, не содержащей привязок. 3. Пусть env станет новой глобальной записью среды. 4. Установите для env.[[ObjectRecord]] значение objRec. 5. Установите для env.[[GlobalThisValue]] значение thisValue. 6. Установите для env.[[DeclarativeRecord]] значение dclRec. 7. Установите env.[[VarNames]] в новый пустой список. 8. Установите для env.[[OuterEnv]] значение null. 9. Вернуть env.
NewModuleEnvironment ( E )
Абстрактная операция NewModuleEnvironment (Новая модульная среда) принимает аргумент E (Запись Среды). При вызове он выполняет следующие шаги:
1. Пусть env будет новой модульной средой, не содержащим привязок. 2. Установите env.[[OuterEnv]] на E. 3. Вернуть env.
Информационные ссылки
ECMAScript | Иерархия типов записей среды
Стандарт ECMAScript — Раздел «9.1.2 Environment Record Operations» — https://tc39.es/ecma262/#sec-environment-record-operations