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

Записи среды (Environment Records) можно рассматривать как существующие в простой объектно-ориентированной иерархии, где Запись Среды — это абстрактный класс с тремя конкретными подклассами:

Записи среды функции (Function Environment Records) и записи среды модуля (module Environment Records) являются подклассами декларативной записи среды.

Запись среды (Environment Record) (Аннотация)

Декларативная Запись Среды (declarative Environment Record) используется для определения эффекта синтаксических элементов языка ECMAScript, таких как предложения FunctionDeclarations, VariableDeclarations и Catch, которые напрямую связывают привязки идентификаторов со значениями языка ECMAScript.

  • Запись среды функции (function Environment Record) соответствует вызову объекта функции ECMAScript и содержит привязки для объявлений верхнего уровня внутри этой функции. Он может установить новую привязку this. Он также фиксирует состояние, необходимое для поддержки вызовов метода super.
  • Запись среды модуля (module Environment Record) содержит привязки для объявлений верхнего уровня модуля Module. Он также содержит привязки, которые явно импортируются модулем Module. Его [[OuterEnv]] является Записью Среды Глобального (global Environment Record).

Объектная Запись Среды (object Environment Record) используется для определения эффекта таких элементов ECMAScript, как WithStatement, которые связывают привязки идентификаторов со свойствами некоторого объекта.

Глобальная Запись Среды (global Environment Record) используется для глобальных объявлений сценария Script. У него нет внешней среды; его [[OuterEnv]] имеет значение null. Он может быть предварительно заполнен привязками идентификаторов и включает связанный глобальный объект, свойства которого обеспечивают некоторые привязки идентификаторов глобальной среды. По мере выполнения кода ECMAScript к глобальному объекту могут быть добавлены дополнительные свойства, а исходные свойства могут быть изменены.

 

Абстрактный класс Записи Среды (Environment Record) включает абстрактные методы спецификации, определенные в таблице 17. Эти абстрактные методы имеют отдельные конкретные алгоритмы для каждого из конкретных подклассов.

Метод Цель
HasBinding(N) Определите, имеет ли запись среды привязку для строкового значения N. Верните истину true, если она есть, и ложь false, если нет.
CreateMutableBinding(N, D) Создайте новую, но неинициализированную изменяемую привязку в записи среды. Строковое значение N — это текст связанного имени. Если логический аргумент D истинен true, привязка может быть впоследствии удалена.
CreateImmutableBinding(N, S) Создайте новую, но неинициализированную неизменяемую привязку в записи среды. Строковое значение N — это текст связанного имени. Если S истинно true, то попытки установить его после инициализации всегда будут вызывать исключение, независимо от настройки строгого режима операций, которые ссылаются на эту привязку.
InitializeBinding(N, V) Установите значение уже существующей, но неинициализированной привязки в записи среды. Строковое значение N — это текст связанного имени. V — это значение для привязки и значение любого типа языка ECMAScript.
SetMutableBinding(N, V, S) Установите значение уже существующей изменяемой привязки в записи среды. Строковое значение N — это текст связанного имени. V — значение для привязки и может быть значением любого типа языка ECMAScript. S — логический флаг. Если S имеет значение true и привязка не может быть установлена, генерирует исключение TypeError.
GetBindingValue(N, S) Возвращает значение уже существующей привязки из записи среды. Строковое значение N — это текст связанного имени. S используется для идентификации ссылок, происходящих из кода строгого режима или требующих иным образом семантики ссылок в строгом режиме. Если S истинно и привязка не существует, генерирует исключение ReferenceError. Если привязка существует, но не инициализирована, выдается ошибка ReferenceError, независимо от значения S.
DeleteBinding(N) Удалите привязку из записи среды. Строковое значение N — это текст связанного имени. Если привязка для N существует, удалите привязку и верните true. Если привязка существует, но не может быть удалена, верните false. Если привязка не существует, верните true.
HasThisBinding() Определите, устанавливает ли запись среды привязку this. Верните true, если это так, и false, если нет.
HasSuperBinding() Определите, устанавливает ли запись среды привязку метода super. Верните true, если это так, и false, если нет.
WithBaseObject() Если эта запись среды связана с оператором «with», вернуть объект with. В противном случае верните undefined.

Таблица 17: Абстрактные методы записей среды

 

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

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

Стандарт ECMAScript — Раздел «9.1.1 The Environment Record Type Hierarchy» — https://tc39.es/ecma262/#sec-the-environment-record-type-hierarchy

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