为什么变量对象在ES5中被改为词汇环境?

Tho*_*son 5 javascript lexical-scope ecmascript-5 ecmascript-3

ES5将变量对象(VO)更改为词汇环境.这种变化的动机是什么,因为VO作为感知已经非常明显了?

Ori*_*iol 2

我认为变量对象更类似于环境记录

环境记录记录在其关联的词法环境范围内创建的标识符绑定。

ES5 中有两种不同类型的环境记录:

声明性环境记录用于定义 ECMAScript 语言语法元素的效果,例如FunctionDeclarationsVariableDeclarationsCatch子句,它们直接将标识符绑定与 ECMAScript 语言值相关联。对象环境记录用于定义 ECMAScript 元素(例如ProgramWithStatement)的效果,这些元素将标识符绑定与某些对象的属性相关联。

所以问题是为什么要引入声明性环境记录,而不是像 ES3 变量对象那样仅使用对象环境记录。不同之处在于声明性环境记录可以具有不可变的绑定:

除了所有环境记录支持的可变绑定之外,声明性环境记录还提供不可变绑定。不可变绑定是一种标识符和值之间的关联一旦建立就不能修改的绑定。

不可变绑定在对象中没有直接等效的东西。属性可以定义为不可配置和不可写,从而变得不可变。然而,

不可变绑定的创建和初始化是不同的步骤,因此此类绑定可能以初始化或未初始化状态存在。

但你不能拥有未初始化的属性。如果您定义了一个值为未定义的不可配置的不可写属性,那么您将无法将其初始化为所需的值。

我认为 ES5 中不可能有未初始化的不可变绑定。CreateImmutableBinding 仅在声明绑定实例化函数定义中使用,并且在这两种情况下都会立即使用 InitializeImmutableBinding 进行初始化。

但这样做可能是为了允许未初始化的不可变绑定作为语言的扩展,例如 JavaScript 1.5 const。或者也许他们已经想到了 ES6 const