这主要归结为“原生对象”或“宿主对象”真正意味着什么的问题。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 。然而,尚不清楚这些定义是否真的有很大的实际影响。