5

ECMAScript 规范定义了一个“在控制进入任何执行上下文之前创建的唯一全局对象”。这个全局对象是 ECMAScript 的标准内置对象,因此是原生对象。

该规范还指出:

除了本规范中定义的属性之外,全局对象可能还有其他主机定义的属性。这可能包括一个属性,其值为全局对象本身;例如,在 HTML 文档对象模型中,全局对象的window属性就是全局对象本身。

因此,在 Web 浏览器中,window对象只是 ECMAScript 全局对象的一个​​方便名称,因此,该window对象是原生 ECMAScript 对象。

我正确理解了吗?

4

3 回答 3

6

这主要归结为“原生对象”或“宿主对象”真正意味着什么的问题。ECMAScript 规范为这些术语提供了相当抽象的定义,并且有足够的空间对定义进行不同的解释。例如,在原生对象的定义中,“语义”这个词实际上在谈论什么。它只是原始对象语义(在由 [[propName]] 内部属性指定的 ES 中)还是包括对象的应用程序级语义。DOM 窗口对象当然具有 ES 规范中未定义的可观察应用程序级语义,因此如果考虑这些语义,它就不能是“本机对象”。

如果您将其视为实施语用学问题,答案可能要简单得多。ES 引擎实现者可能认为在 ES 堆中分配并由 ES 垃圾收集器管理的任何对象都是“本机 ES 对象”。“宿主对象”通常被认为是存在于 ES 堆外部的东西,并且可以使用某种互操作性层(例如 COM、XPCOM 或 V8 嵌入 API)进行访问。根据实现,DOM 窗口对象可能属于任一类别。与任何规范级别的区别相比,这种区别可能对引擎实现者和主机提供者都更相关。

在 ES 规范的下一版中可能会有进一步的定义澄清。甚至还有一个建议来消除“本机”和“主机”对象术语:http ://wiki.ecmascript.org/doku.php?id=strawman:terminology 。然而,尚不清楚这些定义是否真的有很大的实际影响。

于 2012-05-11T16:56:03.397 回答
2

我可以(并且可能会)争辩说,规范不要求全局对象是本地对象。该规范将本机对象定义为:

ECMAScript 实现中的对象,其语义完全由本规范定义,而不是由宿主环境定义。

以及主机对象的定义:

宿主环境提供的对象来完成ECMAScript的执行环境。

宿主对象定义当然可以应用到window,它是宿主环境提供的完成ECMAScript执行环境的对象。此外,ECMAScript 规范并未完全定义其语义。

还有一种情况是,在浏览器中运行的 ECMAScript 引擎,例如 V8、TraceMonkey 等,不会创建window对象。相反,它是由 DOM 提供的(例如,从DOMWindowor构造和继承)。Window

于 2012-05-11T15:05:44.987 回答
0

是的,你的推理听起来是对的。作为半证明,当一个函数在没有显式的情况下执行时this(“在全局上下文中”),它的this计算结果将window在函数体内部。但这确实是特定于 JSVM 的。例如,看看这个 v8-users 消息(以及相关的讨论)。幕后的事情有点复杂,但大致与您向用户描述的一样。

于 2012-05-11T14:28:43.527 回答