25

术语“激活对象”只是“变量对象”的另一个名称,还是它们之间实际上有任何区别?我一直在阅读一些关于如何在执行上下文中形成变量范围的 JavaScript 文章,从我的角度来看,似乎在大多数文章中它们可以互换使用这两个术语。

4

4 回答 4

23

好吧,我刚刚学到了一些东西:)。从这篇文章中可以看出,在函数的执行上下文中,激活对象被用作变量对象:

当创建执行上下文时,许多事情会按照定义的顺序发生。首先,在函数的执行上下文中,会创建一个“Activation”对象。[...]

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

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

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

所以听起来“激活对象”和“变量对象”在函数上下文中是同一个东西,但在全局上下文中却不是。

于 2011-06-14T00:06:04.567 回答
11

激活对象作用域链中最上层的对象,最下层是全局对象。而变量对象是抽象概念,因此,根据其执行上下文,它是作用域链中的任何链接,包括激活/全局对象


它包含:

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

它不包含:

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

更多信息 - JavaScript。核心。

在tl;dr的情况下引用很少:

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

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

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

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

[..]this在代码中访问时,其值直接取自执行上下文,无需任何范围链查找。

于 2014-01-24T04:49:31.780 回答
1

更准确地说,一个 Activation 对象是一种变量对象。这类似于人是人类的一种。如此处所述,术语“变量对象”只是一个通用术语,用于描述任何拥有描述当前执行上下文的环境和范围的属性的对象。

因此,在全局执行上下文中(即在任何函数之外),它最终成为全局对象。为什么?因为它是拥有描述全局执行上下文的环境和范围的属性的对象。

而在函数本地执行上下文中(即,在函数内),函数本地对象(也称为 Activation 对象)是变量对象,因为它是保存描述当前环境和范围的属性的对象执行功能。例如,函数参数等属性。

于 2015-08-08T17:04:57.297 回答
-3

激活的对象仅表示表示网页上发生事件的元素的对象。因此,如果单击图像,则表示该图像的 JavaScript 对象是激活的对象。

于 2018-12-25T17:31:20.230 回答