【问题标题】:In web-browsers, is the window object a native ECMAScript object?在网络浏览器中,窗口对象是原生 ECMAScript 对象吗?
【发布时间】:2012-05-11 14:19:59
【问题描述】:

ECMAScript 规范定义了一个"unique global object that is created before control enters any execution context"。这个全局对象是 ECMAScript 的标准内置对象,因此是原生对象。

规范还规定:

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

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

我理解正确吗?

【问题讨论】:

    标签: javascript browser


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我可以(并且可能会)争辩说,规范不要求全局对象是本地对象。规范defines a native object 为:

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

      还有definition of a host object

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

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

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

      【讨论】:

      • 但是window 对象 ECMAScript 全局对象,其语义 完全由规范定义...(当我说window 对象,我指的不是"window" 全局属性,而是该属性引用的对象,也就是全局对象。宿主环境可能会为全局对象添加额外的属性(比如“window”、“document”、“alert”等),但它的语义是完全定义的,不是吗?
      • @ŠimeVidas:我认为您不能说语义是由 ECMAScript 规范完全定义的。事实上,window 对象的语义是由Window Object specification 定义的,包括它从 AbstractView 接口的继承。另一方面,你问了一个很好的问题,我什至对我可能错的可能性持开放态度。当你需要他的时候,Brendon Eich 在哪里? ;-)
      • 好的,让我们稍微备份一下。在浏览器中,window 对象 ECMAScript 全局对象,对吗? (引用规范:“例如,在 HTML 文档对象模型中,全局对象的 window 属性就是全局对象本身”。)
      • (好吧,任何一方出错的可能性是任何正确论证的标准先决条件,所以,不用说......:)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-11-01
        • 2013-11-19
        • 2013-04-13
        • 2012-07-22
        • 1970-01-01
        • 2014-11-23
        • 2011-12-13
        • 2020-03-25
        • 2020-05-11
        相关资源
        最近更新 更多