【发布时间】:2016-08-03 14:18:22
【问题描述】:
假设窗口没有被遮蔽,typeof window === 'object' 是否总是正确的?这安全吗?
上下文:我正在尝试使用 browserify 将模块导出到全局范围,并且我想检查该模块是否在浏览器中运行,如果是,我想将其导出到全局对象.
【问题讨论】:
标签: javascript browser browserify
假设窗口没有被遮蔽,typeof window === 'object' 是否总是正确的?这安全吗?
上下文:我正在尝试使用 browserify 将模块导出到全局范围,并且我想检查该模块是否在浏览器中运行,如果是,我想将其导出到全局对象.
【问题讨论】:
标签: javascript browser browserify
如果你有真正的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"?我没有找到任何说明它的规范。
typeof 结果表,所以我有 99% 的把握在一个规范发生变化之前,这将一直有效。
"function" 或其他东西。在 ES3 中,内置函数类型可以是"object"。
window(IDL 中没有任何内容),我无法想象它永远是'function',加上'object' 是如果你没有遇到任何其他@ 的后备987654344@ 标准。
global 对象来导出,但出于问题的目的:使用 typeof window !== 'undefined' 会更安全吗?跨度>
如果您在浏览器中,那么是的,window 将始终是一个对象。如果您使用的是 Node.js 等 JavaScript 独立引擎,那么可能不会。
窗口是浏览器上的顶级对象之一。它是浏览器窗口(或选项卡)内的整个 DOM 树的父级,也是大多数函数和事件侦听器经常运行的上下文引用。
所以在任何期望正常工作的浏览器中,都会有一个window 对象。 (一些副业/实验性项目可能已经修改了 JavaScript 引擎并且没有实现window,但这极不可能,而且绝对不是“主流用户”会使用的那种东西)
但是,当我们谈论在浏览器之外运行的 JavaScript 引擎时,情况会有所不同。在 Node.js 等服务器端 JavaScript 运行时,其目的不是像浏览器那样处理窗口/选项卡、URL 和 DOM 树解析。因此,您将无法获得此对象,并且在这些环境中运行 typeof window 将返回 'undefined'。
【讨论】:
要将变量添加到全局范围,browserify 会公开global,它在浏览器中代表window。
Per the browserify docs(强调我的)
此外,如果您使用这些变量中的任何一个,它们将在捆绑输出中以适合浏览器的方式定义:
processBufferglobal- 顶级范围对象(窗口)__filename- 当前执行文件的文件路径__dirname- 当前执行文件的目录路径
就问题而言:
假设窗口没有阴影,typeof window === 'object' 是否总是正确的?
Yes 在浏览器环境中运行。
【讨论】: