【问题标题】:Will `typeof window === 'object'` always be true?`typeof window === 'object'` 会一直为真吗?
【发布时间】:2016-08-03 14:18:22
【问题描述】:

假设窗口没有被遮蔽,typeof window === 'object' 是否总是正确的?这安全吗?

上下文:我正在尝试使用 browserify 将模块导出到全局范围,并且我想检查该模块是否在浏览器中运行,如果是,我想将其导出到全局对象.

【问题讨论】:

    标签: javascript browser browserify


    【解决方案1】:

    如果你有真正的window,由运行时定义,它总是一个对象。 typeof operator (§12.5.6)return values (table 15) 数量有限,window 没有特殊数量。如果他们扩展该表,它可能会改变,但在 ES1 到 ES7 中唯一适用的结果是 'object'

    请记住,Node 根本没有定义 window(所以 typeof 将是 'undefined'),正如您提到的,您可以隐藏它。在具有标准 DOM 实现的浏览器中,window 将是在DOM specification§7.3 中定义的对象。对于 JavaScript,这应该是一个对象,我相信所有浏览器都会这样公开它。

    在 webpack 中,您将使用 output.library 属性并将 output.libraryTarget 设置为 'var',然后捆绑包为您设置全局。我想 browserify 有一个等价物。

    【讨论】:

    • typeof window 是否保证返回"object"?我没有找到任何说明它的规范。
    • @AlexanderO'Mara DOM 规范说它是一个对象(尽管不是 JS 意义上的),并且 JS 规范有一个非常严格的typeof 结果表,所以我有 99% 的把握在一个规范发生变化之前,这将一直有效。
    • 是的,我毫不怀疑它会在实践中发挥作用,只是想知道它是否被明确定义为不是"function" 或其他东西。在 ES3 中,内置函数类型可以是"object"
    • @AlexanderO'Mara 我认为它从未明确说明过,这很有趣(而且有点令人担忧)。由于不能直接调用window(IDL 中没有任何内容),我无法想象它永远是'function',加上'object' 是如果你没有遇到任何其他@ 的后备987654344@ 标准。
    • 出于实际原因,我想我会使用 zzzzBov 中提到的 browserify 的 global 对象来导出,但出于问题的目的:使用 typeof window !== 'undefined' 会更安全吗?跨度>
    【解决方案2】:

    答案是:视情况而定。

    简答:

    如果您在浏览器中,那么是的,window 将始终是一个对象。如果您使用的是 Node.js 等 JavaScript 独立引擎,那么可能不会。

    更多细节:

    窗口是浏览器上的顶级对象之一。它是浏览器窗口(或选项卡)内的整个 DOM 树的父级,也是大多数函数和事件侦听器经常运行的上下文引用。

    所以在任何期望正常工作的浏览器中,都会有一个window 对象。 (一些副业/实验性项目可能已经修改了 JavaScript 引擎并且没有实现window,但这极不可能,而且绝对不是“主流用户”会使用的那种东西)

    但是,当我们谈论在浏览器之外运行的 JavaScript 引擎时,情况会有所不同。在 Node.js 等服务器端 JavaScript 运行时,其目的不是像浏览器那样处理窗口/选项卡、URL 和 DOM 树解析。因此,您将无法获得此对象,并且在这些环境中运行 typeof window 将返回 'undefined'

    【讨论】:

      【解决方案3】:

      要将变量添加到全局范围,browserify 会公开global,它在浏览器中代表window

      Per the browserify docs(强调我的)

      此外,如果您使用这些变量中的任何一个,它们将在捆绑输出中以适合浏览器的方式定义:

      • process
      • Buffer
      • global - 顶级范围对象(窗口)
      • __filename - 当前执行文件的文件路径
      • __dirname - 当前执行文件的目录路径

      就问题而言:

      假设窗口没有阴影,typeof window === 'object' 是否总是正确的?

      Yes 在浏览器环境中运行。

      【讨论】:

        猜你喜欢
        • 2016-08-17
        • 2023-02-12
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        相关资源
        最近更新 更多