2011-06-13 70 views
20

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

+1

我从来没有听说过“变量对象”的。你从哪里得到这个指定? – Zecc 2011-06-13 23:09:07

+3

Zecc - ES3§10.1.3变量Instatiation:“每个执行上下文都与它关联一个变量对象。” ES5将其称为*变量环境*(ES5§10.3,表19),措辞不同但实际上是相同的事情:*创建执行上下文时,其词法环境和变量环境组件最初具有相同的值* – RobG 2011-06-14 01:19:44

回答

17

嗯,我刚刚学到了一些东西:)。从this article,它会出现一个函数的执行上下文内,激活对象被用作可变对象:

当执行上下文中创建了一些事情发生在限定的顺序。首先,在函数的执行上下文中创建一个“激活”对象。

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

但是,当您在全球范围内的时候,没有一个激活对象,因此全局对象作为变量对象,而不是:

全球执行环境得到了一些轻微不同的处理,因为它没有参数,所以它不需要定义的Activation对象来引用它们。 [...]全局对象用作Variable对象,这就是为什么全局声明的函数成为全局对象的属性。

所以它听起来像“激活对象”和“变量对象”是一个函数上下文中的同一事物,但不是在全局上下文中。

+4

+1理查德康福德的文章。请注意,它是在ES5之前编写的,因此需要稍微更新。 ECMA-262的相关部分是§10.4.1,它讨论了* VariableEnvironment *和* LexicalEnvironment *而不是变量对象和激活对象。 – RobG 2011-06-14 01:14:57

+0

啊我一直怀疑他们是一样的..我很确定激活对象是从变量对象继承的。有人愿意证实吗? – 2011-06-14 01:20:26

+0

是的,它们是从变量对象继承而来的。事实上它们都是一样的。 – Thalaivar 2012-12-29 01:25:01

7

一种激活对象处于范围链与最下面为全局对象最上面的对象。 鉴于可变对象是抽象的概念,因此,根据其执行上下文,是在范围链任何链路包括激活/全局对象


它包含:

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

它不包含:

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

另外信息 - JavaScript. The core.

很少引号TL的情况下;博士

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

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

[..]在全球范围内的可变对象全局对象本身[..]

[..]的函数的可变对象是相同的简单可变对象 ,但除了变量函数声明,它还存储形式参数arguments对象,被称为ACTIVA对象

[..]在一个代码访问this时,它的值被直接从执行上下文采取无任何范围链查找。

+0

您可以向我们展示每种情况下的一些源代码吗? – 2014-01-24 05:09:33

0

它更准确的说,一个激活对象的类型是可变的对象。这与一个人是如何成为一种人类相似。如上所述here,术语“可变对象”只是用来描述认为描述当前正在执行上下文的环境和范围的性质的任何对象广义术语。

因此,全局执行上下文(即,外部的任何函数)内,它最终被全局对象。为什么?因为它是保存描述全局执行上下文的环境和范围的属性的对象。

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