`typeof window ==='object'`总是如此?

时间:2016-08-03 14:18:22

标签: javascript browser browserify

假设窗口没有阴影,typeof window === 'object'总是真的吗?这样安全吗?

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

3 个答案:

答案 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 specificationceil($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树的父级,以及大多数函数和事件侦听器经常运行的上下文引用。

JavaScript object hierarchy

因此,在任何期望正常工作的浏览器中,都会有一个window对象。 (某些方面/实验性项目可能已经修改了JavaScript引擎而没有实现window,但这种可能性非常小,绝对不是主流用户将要使用的那种东西&#34 ;)

然而,当我们谈论在浏览器外部运行的JavaScript引擎时,情况会有所不同。在服务器端的JavaScript运行时(如Node.js)上,目的不是使用Windows / tabs,URL和DOM树解析(如浏览器)。因此,您无法使用此对象,并且typeof window会在这些环境中返回'undefined'