Environment Record 是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构,定义 Identifier 与特定变量和函数之间的关联。通常,一个 Environment Record 会与 ECMAScript 代码中的某个特定语法结构相关联,例如 FunctionDeclaration、BlockStatement,或 TryStatement 的某个 Catch 子句。每次对此类代码求值时,都会创建一个新的 Environment Record,用来记录由该代码创建的标识符绑定。
每个 Environment Record 都有一个 [[OuterEnv]] 字段,其值要么是 null,要么是对外层 Environment Record 的引用。它用于表示 Environment Record 值之间的逻辑嵌套关系。某个(内层)Environment Record 的外层引用,是对在逻辑上包围该内层 Environment Record 的那个 Environment Record 的引用。外层 Environment Record 当然也可以有它自己的外层 Environment Record。一个 Environment Record 可以作为多个内层 Environment Record 的外部环境。例如,如果一个 FunctionDeclaration 包含两个嵌套的 FunctionDeclaration,那么这两个嵌套函数各自的 Environment Record,其外层 Environment Record 都将是当前对外围函数进行求值时的那个 Environment Record。
Environment Record 纯粹是规范机制,不需要对应于任何 ECMAScript 实现中的特定构件。ECMAScript 程序不可能直接访问或操作这类值。
The abstract method SetMutableBinding takes arguments name (一个 String,), value (一个 ECMAScript 语言值,), and strict (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成.
每个 Declarative Environment Record 都与一个 ECMAScript 程序作用域相关联,该作用域中包含变量、常量、let、class、module、import 和/或函数声明。Declarative Environment Record 绑定了其作用域内声明所定义的一组标识符。
9.1.1.1.1 HasBinding ( name )
The HasBinding concrete method of a Declarative Environment RecordenvRec takes argument name (一个 String,) and returns 一个包含 Boolean 的正常完成. 它用于判定参数标识符是否是该记录所绑定的标识符之一。 It performs the following steps when called:
The CreateMutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (一个 String,) and deletable (一个 Boolean,) and returns 一个包含 unused 的正常完成. 它为名称 name 创建一个新的可变绑定,并且该绑定未初始化。在这个 Environment Record 中,name 的绑定必须尚不存在。如果 deletable 是 true,则新绑定会被标记为可删除。 It performs the following steps when called:
断言:envRec 尚不存在 name 的绑定。
在 envRec 中为 name 创建一个可变绑定,并记录其尚未初始化。如果 deletable 是 true,则记录新创建的绑定可被后续的 DeleteBinding 调用删除。
返回 unused。
9.1.1.1.3 CreateImmutableBinding ( name, strict )
The CreateImmutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 一个包含 unused 的正常完成. 它为名称 name 创建一个新的不可变绑定,并且该绑定未初始化。在这个 Environment Record 中,name 的绑定必须尚不存在。如果 strict 是 true,则新绑定会被标记为严格绑定。 It performs the following steps when called:
断言:envRec 尚不存在 name 的绑定。
在 envRec 中为 name 创建一个不可变绑定,并记录其尚未初始化。如果 strict 是 true,则记录新创建的绑定是严格绑定。
返回 unused。
9.1.1.1.4 InitializeBinding ( name, value )
The InitializeBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (一个 String,) and value (一个 ECMAScript 语言值,) and returns 一个包含 unused 的正常完成. 它用于将当前名称为 name 的标识符绑定的绑定值设为 value。必须已经存在一个未初始化的 name 绑定。 It performs the following steps when called:
The SetMutableBinding concrete method of a Declarative Environment RecordenvRec takes arguments name (一个 String,), value (一个 ECMAScript 语言值,), and strict (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它尝试将当前名称为 name 的标识符绑定的绑定值更改为 value。通常 name 的绑定已经存在,但在极少数情况下可能不存在。如果该绑定是不可变绑定,则当 strict 为 true 时会抛出 TypeError。 It performs the following steps when called:
functionf() { eval("var x; x = (delete x, 0);"); }
9.1.1.1.6 GetBindingValue ( name, strict )
The GetBindingValue concrete method of a Declarative Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 要么是包含 ECMAScript 语言值的正常完成,要么是抛出完成. 它返回其所绑定的、名称为 name 的标识符的值。如果该绑定存在但尚未初始化,则无论 strict 的值为何,都会抛出 ReferenceError。 It performs the following steps when called:
断言:envRec 具有 name 的绑定。
如果 envRec 中 name 的绑定是未初始化绑定,抛出一个 ReferenceError 异常。
返回 envRec 中当前绑定到 name 的值。
9.1.1.1.7 DeleteBinding ( name )
The DeleteBinding concrete method of a Declarative Environment RecordenvRec takes argument name (一个 String,) and returns 一个包含 Boolean 的正常完成. 它只能删除那些被显式指定为可删除的绑定。 It performs the following steps when called:
The HasBinding concrete method of a Object Environment RecordenvRec takes argument name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它用于判定其关联的绑定对象是否具有名称为 name 的属性。 It performs the following steps when called:
The CreateMutableBinding concrete method of a Object Environment RecordenvRec takes arguments name (一个 String,) and deletable (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它会在 Environment Record 关联的绑定对象中创建一个名为 name 的属性,并将其初始化为值 undefined。如果 deletable 是 true,则该新属性的 [[Configurable]] 特性设为 true;否则设为 false。 It performs the following steps when called:
The InitializeBinding concrete method of a Object Environment RecordenvRec takes arguments name (一个 String,) and value (一个 ECMAScript 语言值,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它用于将当前名称为 name 的标识符绑定的绑定值设为 value。 It performs the following steps when called:
The SetMutableBinding concrete method of a Object Environment RecordenvRec takes arguments name (一个 String,), value (一个 ECMAScript 语言值,), and strict (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它尝试将该 Environment Record 关联的绑定对象中名称为 name 的属性值设为 value。通常名称为 name 的属性已存在,但如果不存在,或当前不可写,则错误处理由 strict 决定。 It performs the following steps when called:
The GetBindingValue concrete method of a Object Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 要么是包含 ECMAScript 语言值的正常完成,要么是抛出完成. 它返回其关联的绑定对象中名称为 name 的属性值。该属性应当已经存在,但如果不存在,则结果取决于 strict。 It performs the following steps when called:
The DeleteBinding concrete method of a Object Environment RecordenvRec takes argument name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它只能删除那些对应于环境对象属性、且其 [[Configurable]] 特性值为 true 的绑定。 It performs the following steps when called:
The WithBaseObject concrete method of a Object Environment RecordenvRec takes no arguments and returns 一个 Object 或 undefined. It performs the following steps when called:
The abstract operation BindThisValue takes arguments envRec (一个 Function Environment Record,) and value (一个 ECMAScript 语言值,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它设置 envRec.[[ThisValue]] 并记录其已经初始化。 It performs the following steps when called:
The abstract operation GetSuperBase takes argument envRec (一个 Function Environment Record,) and returns 一个 Object、null 或 undefined. 它返回作为 envRec 中绑定的 super 属性访问基础对象的那个对象。值 undefined 表示这类访问将产生运行时错误。 It performs the following steps when called:
令 home 为 envRec.[[FunctionObject]].[[HomeObject]]。
Global Environment Record 用于表示在某个共享 realm 中,由所有被处理的 ECMAScript Script 元素共同共享的最外层作用域。Global Environment Record 为内建全局对象(条款 19)、全局对象的属性,以及 Script 中出现的所有顶层声明(8.2.9、8.2.11)提供绑定。
The HasBinding concrete method of a Global Environment RecordenvRec takes argument name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它用于判定参数标识符是否是该记录所绑定的标识符之一。 It performs the following steps when called:
The CreateMutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (一个 String,) and deletable (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它为名称 name 创建一个新的未初始化可变绑定。该绑定创建于关联的 DeclarativeRecord 中。DeclarativeRecord 中必须还不存在 name 的绑定。如果 deletable 是 true,则新绑定会被标记为可删除。 It performs the following steps when called:
The CreateImmutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它为名称 name 创建一个新的未初始化不可变绑定。在这个 Environment Record 中,name 的绑定必须尚不存在。如果 strict 是 true,则新绑定会被标记为严格绑定。 It performs the following steps when called:
The InitializeBinding concrete method of a Global Environment RecordenvRec takes arguments name (一个 String,) and value (一个 ECMAScript 语言值,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它用于将当前名称为 name 的标识符绑定的绑定值设为 value。必须已经存在一个未初始化的 name 绑定。 It performs the following steps when called:
The SetMutableBinding concrete method of a Global Environment RecordenvRec takes arguments name (一个 String,), value (一个 ECMAScript 语言值,), and strict (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它尝试将当前名称为 name 的标识符绑定的绑定值更改为 value。如果该绑定是不可变绑定且 strict 是 true,则会抛出一个 TypeError。通常名称为 name 的绑定已经存在,但如果不存在,或当前不可写,则错误处理由 strict 决定。 It performs the following steps when called:
The GetBindingValue concrete method of a Global Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 要么是包含 ECMAScript 语言值的正常完成,要么是抛出完成. 它返回其绑定的、名称为 name 的标识符的值。如果绑定是未初始化绑定,则会抛出一个 ReferenceError 异常。通常名称为 name 的绑定已经存在,但如果不存在,或当前不可写,则错误处理由 strict 决定。 It performs the following steps when called:
The DeleteBinding concrete method of a Global Environment RecordenvRec takes argument name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它只能删除那些被显式指定为可删除的绑定。 It performs the following steps when called:
The WithBaseObject concrete method of a Global Environment RecordenvRec takes no arguments and returns undefined. It performs the following steps when called:
返回 undefined。
9.1.1.4.12 HasLexicalDeclaration ( envRec, name )
The abstract operation HasLexicalDeclaration takes arguments envRec (一个 Global Environment Record,) and name (一个 String,) and returns 一个 Boolean. 它用于判定参数标识符在 envRec 中是否具有一个由词法声明(例如 LexicalDeclaration 或 ClassDeclaration)创建的绑定。 It performs the following steps when called:
9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, name )
The abstract operation HasRestrictedGlobalProperty takes arguments envRec (一个 Global Environment Record,) and name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它用于判定参数标识符是否是全局对象上某个属性的名称,并且该属性不能被全局词法绑定遮蔽。 It performs the following steps when called:
全局对象上可能存在某些直接创建出来的属性,而不是通过 var 或 function 声明来声明的。不能创建一个与全局对象的不可配置属性同名的全局词法绑定。全局属性 "undefined" 就是这样一个属性的例子。
9.1.1.4.14 CanDeclareGlobalVar ( envRec, name )
The abstract operation CanDeclareGlobalVar takes arguments envRec (一个 Global Environment Record,) and name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它用于判定:如果对同一个参数 name 调用对应的 CreateGlobalVarBinding,是否会成功。冗余的 var 声明,以及为已有全局对象属性进行的 var 声明,都是允许的。 It performs the following steps when called:
9.1.1.4.15 CanDeclareGlobalFunction ( envRec, name )
The abstract operation CanDeclareGlobalFunction takes arguments envRec (一个 Global Environment Record,) and name (一个 String,) and returns 要么是包含 Boolean 的正常完成,要么是抛出完成. 它用于判定:如果对同一个参数 name 调用对应的 CreateGlobalFunctionBinding,是否会成功。 It performs the following steps when called:
The abstract operation CreateGlobalVarBinding takes arguments envRec (一个 Global Environment Record,), name (一个 String,), and deletable (一个 Boolean,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它在关联的 Object Environment Record 中创建并初始化一个可变绑定。如果绑定已经存在,则重用它,并假定其已经初始化。 It performs the following steps when called:
The abstract operation CreateGlobalFunctionBinding takes arguments envRec (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns 要么是包含 unused 的正常完成,要么是抛出完成. 它在关联的 Object Environment Record 中创建并初始化一个可变绑定。如果绑定已经存在,则会被替换。 It performs the following steps when called:
The GetBindingValue concrete method of a Module Environment RecordenvRec takes arguments name (一个 String,) and strict (一个 Boolean,) and returns 要么是包含 ECMAScript 语言值的正常完成,要么是抛出完成. 它返回其绑定的、名称为 name 的标识符的值。不过,如果该绑定是一个间接绑定,则返回目标绑定的值。如果绑定存在但未初始化,则抛出 ReferenceError。 It performs the following steps when called:
The abstract operation CreateImportBinding takes arguments envRec (一个 Module Environment Record,), name (一个 String,), targetModule (一个 Module Record,), and targetName (一个 String,) and returns unused. 它为名称 name 创建一个新的、已初始化的不可变间接绑定。在 envRec 中,name 的绑定必须尚不存在。targetName 是存在于 targetModule 的 Module Environment Record 中的某个绑定名称。对这个新绑定值的访问将会间接访问目标绑定所绑定的值。 It performs the following steps when called:
The abstract operation GetIdentifierReference takes arguments env (一个 Environment Record 或 null,), name (一个 String,), and strict (一个 Boolean,) and returns 要么是包含 Reference Record 的正常完成,要么是抛出完成. It performs the following steps when called:
The abstract operation NewDeclarativeEnvironment takes argument outerEnv (一个 Environment Record 或 null,) and returns 一个 Declarative Environment Record. It performs the following steps when called:
The abstract operation NewObjectEnvironment takes arguments obj (一个 Object,), isWithEnvironment (一个 Boolean,), and outerEnv (一个 Environment Record 或 null,) and returns 一个 Object Environment Record. It performs the following steps when called:
The abstract operation NewFunctionEnvironment takes arguments func (一个 ECMAScript 函数对象,) and newTarget (一个 Object 或 undefined,) and returns 一个 Function Environment Record. It performs the following steps when called:
The abstract operation NewGlobalEnvironment takes arguments obj (一个 Object,) and thisValue (一个 Object,) and returns 一个 Global Environment Record. It performs the following steps when called:
The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (一个 PrivateEnvironment Record 或 null,) and returns 一个 PrivateEnvironment Record. It performs the following steps when called:
The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (一个 PrivateEnvironment Record,) and identifier (一个 String,) and returns 一个 Private Name. It performs the following steps when called:
The abstract operation InitializeHostDefinedRealm takes no arguments and returns 要么是包含 unused 的正常完成,要么是抛出完成. It performs the following steps when called:
The abstract operation SetDefaultGlobalBindings takes argument realmRec (一个 Realm Record,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. It performs the following steps when called:
The abstract operation GetActiveScriptOrModule takes no arguments and returns 一个 Script Record、一个 Module Record 或 null. 它用于根据正在运行的执行上下文,确定当前正在运行的脚本或模块。 It performs the following steps when called:
The abstract operation ResolveBinding takes argument name (一个 String,) and optional argument env (一个 Environment Record 或 undefined,) and returns 要么是包含 Reference Record 的正常完成,要么是抛出完成. 它用于确定 name 的绑定。env 可用于显式提供应当被搜索该绑定的 Environment Record。 It performs the following steps when called:
The abstract operation GetThisEnvironment takes no arguments and returns 一个 Environment Record. 它查找当前提供关键字this 绑定的那个 Environment Record。 It performs the following steps when called:
The abstract operation ResolveThisBinding takes no arguments and returns 要么是包含 ECMAScript 语言值的正常完成,要么是抛出完成. 它使用正在运行执行上下文的 LexicalEnvironment 来确定关键字this 的绑定。 It performs the following steps when called:
The abstract operation GetNewTarget takes no arguments and returns 一个 Object 或 undefined. 它使用正在运行执行上下文的 LexicalEnvironment 来确定 NewTarget 值。 It performs the following steps when called:
The abstract operation RunSuspendedContext takes arguments context (一个执行上下文) and completionRecord (一个完成记录) and returns 要么是一个包含 ECMAScript 语言值或 unused 的正常完成,要么是一个突然完成. 它恢复 context(将 completionRecord 作为恢复值发送给它),并等待结果。 It performs the following steps when called:
在某些环境中,允许某个给定 agent 挂起可能并不合理。例如,在 Web 浏览器环境中,禁止挂起文档的主事件处理线程可能是合理的,而仍然允许 worker 的事件处理线程挂起。
9.6.3 IncrementModuleAsyncEvaluationCount ( )
The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:
WeakRef-obliviousness 与活性一起,捕捉了两个概念。其一,WeakRef 本身不会让其 referent 保持存活。其二,活性中的循环并不意味着某个值就是活的。具体来说,如果判定 v 的活性依赖于判定某个 WeakRef referent r 的活性,那么 r 的活性就不能反过来假定 v 的活性,否则会形成循环论证。
Note 2
WeakRef-obliviousness 是对对象或 symbol 的集合而不是单个值定义的,这是为了处理循环。如果它是对单个值定义的,那么处于循环中的某个 WeakRef referent 即使其身份仅通过该循环中的其他 WeakRef referent 才能被观察到,也会被认为是活的。
Note 3
通俗地说,如果每个包含某个单独对象或 symbol 的集合都是活的,那么我们就说这个对象或 symbol 是活的。
在求值期间的任意时刻,一个对象和/或 symbol 的集合 objectSet 被认为是活的,当且仅当满足以下任一条件:
The abstract operation ClearKeptObjects takes no arguments and returns unused. 当一段同步的 ECMAScript 执行序列完成时,ECMAScript 实现预期会调用 ClearKeptObjects。 It performs the following steps when called:
The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (一个 FinalizationRegistry,) and returns 要么是包含 unused 的正常完成,要么是抛出完成. It performs the following steps when called:
The abstract operation CanBeHeldWeakly takes argument v (一个 ECMAScript 语言值,) and returns 一个 Boolean. 当且仅当 v 适合用作弱引用时,它返回 true。只有适合用作弱引用的值,才能作为 WeakMap 的键、WeakSet 的元素、WeakRef 的目标,或 FinalizationRegistry 的某个目标。 It performs the following steps when called:
如果 v 是一个 Object,返回 true。
如果 v 是一个 Symbol,且 KeyForSymbol(v) 是 undefined,返回 true。
返回 false。
Note
没有语言身份的语言值可以在没有先前引用的情况下被显现,因此不适合作为弱引用。由 Symbol.for 产生的 Symbol 值,与其他 Symbol 值不同,它没有语言身份,因此不适合作为弱引用。众所周知的 symbol 很可能永远不会被回收,但它们仍被视为适合作为弱引用,因为它们数量有限,因此可由多种实现方式来管理。然而,在某个存活的 WeakMap 中,与一个众所周知的 symbol 关联的任何值都不太可能被回收,并且在实现中可能会“泄漏”内存资源。