ECMAScript规范定义了"unique global object that is created before control enters any execution context"。此全局对象是ECMAScript的标准内置对象,因此是本机对象。
该规范还指出:
除了本规范中定义的属性全局 对象可能具有其他主机定义的属性。这可能包括一个 属性,其值是全局对象本身;例如,在 HTML文档对象模型全局对象的
window
属性是 全球对象本身。
因此,在Web浏览器中,window
对象只是ECMAScript全局对象的一个方便名称,因此window
对象是本机ECMAScript对象。
我得到了这个吗?
答案 0 :(得分:5)
这主要归结为成为“本地对象”或“宿主对象”的真正含义的问题。 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。但是,目前尚不清楚这些定义是否真的具有很大的实际影响。
答案 1 :(得分:2)
我可以(并且可能会)认为规范不要求全局对象是本机对象。规范defines a native object为:
ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义。
主机环境提供的对象,以完成ECMAScript的执行环境。
主机对象定义当然可以应用于window
,它是主机环境提供的对象,用于完成ECMAScript的执行环境。另外,ECMAScript规范没有完全定义它的语义。
还有一种情况是,在浏览器中运行的ECMAScript引擎(如V8,TraceMonkey等)不会创建window
对象。相反,它由DOM提供(例如,构建并继承自DOMWindow
或Window
)。
答案 2 :(得分:0)
是的,你的推理听起来是正确的。作为半证明,当函数在没有显式this
(“在全局上下文中”)的情况下执行时,其this
将在函数体内评估为window
。但这确实是JSVM特有的。例如,看看this v8-users message(以及相关的讨论。)幕后的事情有点复杂,但看起来大致与用户描述的一样。