`typeof window === 'object'` 总是正确的吗?
Will `typeof window === 'object'` always be true?
假设 window 没有隐藏,typeof window === 'object'
会永远为真吗?这样安全吗?
上下文:我正在尝试使用 browserify 将模块导出到全局范围,我想包含一个检查以查看该模块是否在浏览器中 运行,如果是,我想将其导出到全局对象。
为了将变量添加到全局范围,browserify 公开了 global
,在浏览器中表示 window
。
Per the browserify docs(强调我的)
Additionally, if you use any of these variables, they will be defined in the bundled output in a browser-appropriate way:
process
Buffer
global
- top-level scope object (window)
__filename
- file path of the currently executing file
__dirname
- directory path of the currently executing file
就被问的问题而言:
Assuming window isn't shadowed, will typeof window === 'object' always be true?
Yes 鉴于它在浏览器环境中 运行。
如果你有真正的window
,由运行时定义,它将永远是一个对象。 typeof
operator (§12.5.6) has a limited number of return values (table 15),window
没有特别的。如果他们扩展 table,它可能会改变,但在 ES1 到 ES7 中唯一适用的结果是 'object'
。
请记住,Node 根本没有定义 window
(因此 typeof
将是 'undefined'
),您可以像您提到的那样隐藏它。在具有标准 DOM 实现的浏览器中,window
将是 §7.3 of the DOM specification 中定义的对象。对于 JavaScript,这应该是一个对象,我相信所有浏览器都将其公开。
在 webpack 中,您可以使用 output.library
属性 并将 output.libraryTarget
设置为 'var'
,然后 bundle 会为您设置全局。我想 browserify 有一个等价物。
答案是:视情况而定。
简答:
如果您在浏览器中,那么是的,window
将始终是一个对象。如果您使用 JavaScript 独立引擎,例如 Node.js,那么可能不会。
更多详情:
A window 是浏览器上的顶级对象之一。它是存在于浏览器 window(或选项卡)中的整个 DOM 树的父级,以及大多数函数和事件侦听器经常 运行.[=16= 的上下文引用]
所以在任何期望正常工作的浏览器中,都会有一个window
对象。 (一些 side/experimental 项目可能已经修改了 JavaScript 引擎并且没有实现 window
,但这是极不可能的,而且绝对不是将要使用的那种东西"mainstream users")
但是,当我们谈论 JavaScript 引擎 运行 在浏览器之外时,情况会有所不同。在服务器端 JavaScript 运行 时,例如 Node.js,其目的是不使用 windows/tabs、URL 和 DOM 树解析,例如浏览器做。因此,您将无法使用此对象,并且 运行ning typeof window
将在这些环境中 return 'undefined'
。
假设 window 没有隐藏,typeof window === 'object'
会永远为真吗?这样安全吗?
上下文:我正在尝试使用 browserify 将模块导出到全局范围,我想包含一个检查以查看该模块是否在浏览器中 运行,如果是,我想将其导出到全局对象。
为了将变量添加到全局范围,browserify 公开了 global
,在浏览器中表示 window
。
Per the browserify docs(强调我的)
Additionally, if you use any of these variables, they will be defined in the bundled output in a browser-appropriate way:
process
Buffer
global
- top-level scope object (window)__filename
- file path of the currently executing file__dirname
- directory path of the currently executing file
就被问的问题而言:
Assuming window isn't shadowed, will typeof window === 'object' always be true?
Yes 鉴于它在浏览器环境中 运行。
如果你有真正的window
,由运行时定义,它将永远是一个对象。 typeof
operator (§12.5.6) has a limited number of return values (table 15),window
没有特别的。如果他们扩展 table,它可能会改变,但在 ES1 到 ES7 中唯一适用的结果是 'object'
。
请记住,Node 根本没有定义 window
(因此 typeof
将是 'undefined'
),您可以像您提到的那样隐藏它。在具有标准 DOM 实现的浏览器中,window
将是 §7.3 of the DOM specification 中定义的对象。对于 JavaScript,这应该是一个对象,我相信所有浏览器都将其公开。
在 webpack 中,您可以使用 output.library
属性 并将 output.libraryTarget
设置为 'var'
,然后 bundle 会为您设置全局。我想 browserify 有一个等价物。
答案是:视情况而定。
简答:
如果您在浏览器中,那么是的,window
将始终是一个对象。如果您使用 JavaScript 独立引擎,例如 Node.js,那么可能不会。
更多详情:
A window 是浏览器上的顶级对象之一。它是存在于浏览器 window(或选项卡)中的整个 DOM 树的父级,以及大多数函数和事件侦听器经常 运行.[=16= 的上下文引用]
所以在任何期望正常工作的浏览器中,都会有一个window
对象。 (一些 side/experimental 项目可能已经修改了 JavaScript 引擎并且没有实现 window
,但这是极不可能的,而且绝对不是将要使用的那种东西"mainstream users")
但是,当我们谈论 JavaScript 引擎 运行 在浏览器之外时,情况会有所不同。在服务器端 JavaScript 运行 时,例如 Node.js,其目的是不使用 windows/tabs、URL 和 DOM 树解析,例如浏览器做。因此,您将无法使用此对象,并且 运行ning typeof window
将在这些环境中 return 'undefined'
。