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