if(typeof window!=='undefined')的目的是什么?

时间:2015-09-16 02:52:50

标签: javascript jspm

致电

的目的是什么?
if (typeof window !== 'undefined') 

我在JSPM plugin-css和其他一些图书馆看到了它。

2 个答案:

答案 0 :(得分:15)

这是一个惯用的检查,看看脚本是否在网页浏览器的网页中运行。

有人可能会认为JavaScript只在网页中运行,就像它最初设计的那样,但事实并非如此:JavaScript是一种多功能语言,也可用于在Node.js中编写服务器端代码或IIS'Active Server Pages(自1996年以来!),或"web workers"内,这些是在后台运行的网页的脚本。

在网页中,有几个内部对象,例如window,其他环境(如Node.js)不会有window,但可能有其他对象,如console(好吧,现在大多数浏览器都存在console,但最初并不存在。)

例如,在不同的上下文中,脚本的全局范围中可以使用不同的对象(此列表并非详尽无遗):

  • 在所有JavaScript上下文中都有一组标准对象,例如:
    • MathDate
    • ObjectNumberFunctionString等(代表内置类型的对象)等
  • In a web-page's script<script>个标签内):
    • Window(接口)作为window全局对象公开,该对象也是 全局范围的对象(因此声明var foo全局范围实际上创建了一个属性window.foo!)
    • 因此document全局对象实际上正在访问window.document属性。
  • In a Node.js server-side script
    • 由于Node.js不是带有DOM的Web浏览器,因此没有window个全局对象,也没有documentnavigator等属性,但是您确实获得了其他全局对象:
    • console
    • process
    • exports
  • In a web-page's Web Worker script
    • 在Web Worker中也没有window对象,因此全局范围是WindowOrWorkerGlobalScope对象,它通过以下属性公开对象:
    • caches
    • indexedDB
    • origin
  • 在使用JScript(而不是VBScript)的IIS Active Server Pages中:
    • response(用于写入响应流)
    • request(用于从传入的HTTP请求中读取)
    • ApplicationSession(用于在请求之间保留数据)
  • 在Microsoft Windows的Shell脚本宿主中
    • WScript全局对象公开脚本主机的功能。

答案 1 :(得分:12)

这可以用于检测代码是否在典型的浏览器环境(例如,具有浏览器DOM的环境)中运行,或者在一些其他JS环境中运行,因为window对象存在于典型的浏览器JS中,但是不存在于node.js之类的内容中,甚至不存在于浏览器中的webWorker中。

如果window对象不存在,则

typeof window === 'undefined'

所以您询问的代码:

if (typeof window !== 'undefined') 
如果if对象确实作为顶级变量存在,

将执行window块。

在您链接的特定代码中,如果插件恰好在非浏览器环境中使用,则不要执行引用DOM对象(如document)的浏览器目标代码。