【问题标题】:Activation and Variable Object in JavaScript?JavaScript 中的激活和变量对象?
【发布时间】:2011-09-14 07:21:02
【问题描述】:

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

【问题讨论】:

  • 我从未听说过“变量对象”。你是从哪里得到这个称号的?
  • Zecc — ES3 § 10.1.3 变量实例化:“每个执行上下文都关联了一个变量对象。” ES5 将其称为 VariableEnvironment(ES5 § 10.3,表 19),措辞不同但实际上相同:创建执行上下文时,其 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值.

标签: javascript ecma262


【解决方案1】:

嗯,我刚刚学到了一些东西:)。从this article 看来,在函数的执行上下文中,激活对象被用作变量对象:

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

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

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

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

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

【讨论】:

  • +1 用于引用 Richard Cornford 的文章。请注意,它是在 ES5 之前编写的,因此需要进行一些更新。 ECMA-262 的相关部分是第 10.4.1 节,其中讨论了 VariableEnvironmentLexicalEnvironment 而不是变量对象和激活对象。
  • 啊我一直怀疑它们是相同的..现在我很确定激活对象是从变量对象继承的。有人愿意确认吗?
  • 是的,它们是从变量对象继承的。实际上它们都是一样的。
【解决方案2】:

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


它包含:

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

它不包含:

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

更多信息 - JavaScript. The core.

tl;dr 中的引号很少:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这个问题与DOM/浏览器环境无关。问题指的是 ECMAscript “激活”对象,而不是 :active DOM 节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2014-08-24
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多