假设窗口没有阴影,typeof window === 'object'
总是真的吗?这样安全吗?
上下文:我正在尝试使用browserify将模块导出到全局范围,我想要包含一个检查以查看该模块是否在浏览器中运行,如果是,我想将其导出到全局对象
答案 0 :(得分:2)
如果您拥有由运行时定义的真实window
,它将始终是一个对象。 typeof
operator (§12.5.6)的return values (table 15)数量有限,window
没有特别的§7.3。如果他们扩展该表,它可能会更改,但ES1到ES7中唯一适用的结果是'object'
。
请记住,Node根本没有定义window
(所以typeof
将是'undefined'
),你可以像你提到的那样隐藏它。在具有标准DOM实现的浏览器中,window
将是DOM specification的ceil($number)
中定义的对象。对于JavaScript,这应该是一个对象,我相信所有浏览器都会这样暴露它。
在webpack中,您将使用output.library
属性并将output.libraryTarget
设置为'var'
,然后该捆绑包会为您设置全局。我认为browserify有一个等价物。
答案 1 :(得分:1)
要将变量添加到全局范围,browserify会在浏览器中显示global
代表window
的内容。
Per the browserify docs(强调我的)
此外,如果您使用这些变量中的任何一个,它们将以适合浏览器的方式在捆绑输出中定义:
process
Buffer
global
- 顶级范围对象(窗口)__filename
- 当前正在执行的文件的文件路径__dirname
- 当前正在执行的文件的目录路径
就问题而言:
假设窗口没有被遮挡,则会输入窗口===' object'永远是真的吗?
Yes鉴于它在浏览器环境中运行。
答案 2 :(得分:1)
如果你在浏览器中,那么是的,window
将始终是一个对象。如果您使用的是.NET独立引擎(如Node.js),那么可能没有。
窗口是浏览器上的顶级层次结构对象之一。它是浏览器窗口(或选项卡)中存在的整个DOM树的父级,以及大多数函数和事件侦听器经常运行的上下文引用。
因此,在任何期望正常工作的浏览器中,都会有一个window
对象。 (某些方面/实验性项目可能已经修改了JavaScript引擎而没有实现window
,但这种可能性非常小,绝对不是主流用户将要使用的那种东西&#34 ;)
然而,当我们谈论在浏览器外部运行的JavaScript引擎时,情况会有所不同。在服务器端的JavaScript运行时(如Node.js)上,目的不是使用Windows / tabs,URL和DOM树解析(如浏览器)。因此,您无法使用此对象,并且typeof window
会在这些环境中返回'undefined'
。