术语“激活对象”只是“变量对象”的另一个名称,还是它们之间实际上有什么区别?我一直在阅读一些关于如何在执行上下文中形成变量作用域的JavaScript文章,从我的观点来看,似乎在大多数文章中他们可以互换地使用这两个术语。
答案 0 :(得分:19)
好吧,我刚学到了东西:)。从this article开始,在函数的执行上下文中出现,激活对象被用作变量对象:
创建执行上下文时,会按定义的顺序执行许多操作。首先,在函数的执行上下文中,创建“激活”对象。 [...]
然后使用ECMA 262称为“变量”对象的对象进行“变量实例化”的过程。但是,Activation对象用作Variable对象(请注意,重要的是:它们是同一个对象)。为每个函数的形式参数创建Variable对象的命名属性,如果函数调用的参数与这些参数对应,则将这些参数的值分配给属性(否则指定的值未定义)。
但是,当您在全局范围内时,没有激活对象,因此全局对象将用作变量对象:
全局执行上下文的处理略有不同,因为它没有参数,所以它不需要定义的Activation对象来引用它们。 [...]全局对象用作Variable对象,这就是全局声明的函数成为全局对象的属性的原因。
所以听起来“激活对象”和“变量对象”在函数上下文中是相同的,但不在全局上下文中。
答案 1 :(得分:9)
激活对象是范围链中最重要的对象,最下面的对象是全局对象。 而变量对象是抽象概念,因此,根据其执行上下文, scope-chain 中的任何链接,包括激活/全局对象。< / p>
它包含:
arguments
的对象的参数(如果您希望您的函数支持多个签名)。它不包含:
this
(因为它不是变量); 更多信息 - JavaScript. The core.
tl; dr :
的报价很少变量对象是与执行上下文相关的数据范围。它是与上下文关联的特殊对象,它存储变量和函数声明在上下文中定义。
变量对象是抽象概念。在物理上,在不同的上下文类型中,它使用不同的对象呈现。
[..]在全球范围内变量对象是全局对象本身[..]
[..]函数的变量对象是同一个简单的变量对象,但除了变量和函数声明,它还存储形式参数和
arguments
对象,称为激活对象。[..]访问代码中的
this
时,其值直接来自执行上下文,无需任何范围链查找。
答案 2 :(得分:0)
更准确地说,Activation对象是一种Variable对象。这类似于男人是一种人类。如上所述here,术语“变量”对象&#39;只是一个GENERALIZED术语,用于描述包含描述当前正在执行的上下文的环境和范围的属性的任何对象。
因此,在全局执行上下文中(即,在任何函数之外),它最终成为全局对象。为什么?因为它是包含描述全局执行上下文的环境和范围的属性的对象。
在函数本地执行上下文(即函数内)中,函数本地对象(也称为Activation对象)是Variable对象,因为它是包含描述属性的对象当前执行函数的环境和范围。例如函数参数等属性。
答案 3 :(得分:-2)
已激活的对象仅表示表示事件发生在网页上的元素的对象。因此,如果单击图像,则表示该图像的JavaScript对象就是激活的对象。