JavaScript中的激活和变量对象?

Ben*_*jia 25 javascript ecma262

术语"激活对象"只是"变量对象"的另一个名称,还是它们之间实际上有什么区别?我一直在阅读一些关于如何在执行上下文中形成变量作用域的JavaScript文章,从我的观点来看,似乎在大多数文章中他们可以互换地使用这两个术语.

nra*_*itz 21

好吧,我刚学到了东西:).从本文中可以看出,在函数的执行上下文中,Activation Object被用作变量对象:

创建执行上下文时,会按定义的顺序执行许多操作.首先,在函数的执行上下文中,创建"激活"对象.[...]

然后,使用ECMA 262称为"变量"对象的对象进行"变量实例化"的过程.但是,Activation对象用作Variable对象(请注意,重要的是:它们是同一个对象).为每个函数的形式参数创建Variable对象的命名属性,如果函数调用的参数与这些参数对应,则将这些参数的值分配给属性(否则指定的值未定义).

但是,当您处于全局范围时,没有激活对象,因此全局对象将用作变量对象:

全局执行上下文处理略有不同,因为它没有参数,所以它不需要定义的Activation对象来引用它们.[...]全局对象用作Variable对象,这就是全局声明的函数成为全局对象的属性的原因.

所以听起来"激活对象"和"变量对象"在函数上下文中是相同的,但不在全局上下文中.

  • +1引用Richard Cornford的文章.请注意,它是在ES5之前编写的,因此需要稍加更新.ECMA-262的相关部分是§10.4.1,其中讨论了*VariableEnvironment*和*LexicalEnvironment*而不是变量对象和激活对象. (5认同)

ika*_*uss 10

一个激活对象处于最上面的对象范围链与最下面的是全局对象.而变量对象是抽象概念,因此,根据其执行上下文,是范围链中的任何链接,包括激活/全局对象.


它包含:

  • 您在函数体内声明的所有变量和函数 ;
  • 名称由函数签名指定的参数 ;
  • 作为命名对象的arguments参数(如果您希望函数支持多个签名).

它不包含:

  • this (因为它不是变量);
  • 命名函数表达式.

更多信息 - JavaScript.核心.

如果是tl,则很少引用;博士:

可变对象是一个数据的范围与执行上下文相关的.它是与上下文关联的特殊对象,它存储变量和函数声明在上下文中定义.

可变对象是一个抽象的概念.在物理上,在不同的上下文类型中,它使用不同的对象呈现.

[..]在全局上下文中,变量对象全局对象本身[...]

[..]函数的变量对象是相同的简单变量对象,但除了变量函数声明之外,它还存储形式参数arguments对象,并称为激活对象.

[..] this在代码中访问时,其值直接来自执行上下文,而不进行任何范围链查找.