答案 0 :(得分:15)
这是一个惯用的检查,看看脚本是否在网页浏览器的网页中运行。
有人可能会认为JavaScript只在网页中运行,就像它最初设计的那样,但事实并非如此:JavaScript是一种多功能语言,也可用于在Node.js中编写服务器端代码或IIS'Active Server Pages(自1996年以来!),或"web workers"内,这些是在后台运行的网页的脚本。
在网页中,有几个内部对象,例如window
,其他环境(如Node.js)不会有window
,但可能有其他对象,如console
(好吧,现在大多数浏览器都存在console
,但最初并不存在。)
例如,在不同的上下文中,脚本的全局范围中可以使用不同的对象(此列表并非详尽无遗):
Math
和Date
Object
,Number
,Function
,String
等(代表内置类型的对象)等<script>
个标签内):
Window
(接口)作为window
全局对象公开,该对象也是 全局范围的对象(因此声明var foo
全局范围实际上创建了一个属性window.foo
!)document
全局对象实际上正在访问window.document
属性。window
个全局对象,也没有document
或navigator
等属性,但是您确实获得了其他全局对象:console
process
exports
window
对象,因此全局范围是WindowOrWorkerGlobalScope
对象,它通过以下属性公开对象:caches
indexedDB
origin
response
(用于写入响应流)request
(用于从传入的HTTP请求中读取)Application
和Session
(用于在请求之间保留数据)WScript
全局对象公开脚本主机的功能。答案 1 :(得分:12)
这可以用于检测代码是否在典型的浏览器环境(例如,具有浏览器DOM的环境)中运行,或者在一些其他JS环境中运行,因为window
对象存在于典型的浏览器JS中,但是不存在于node.js之类的内容中,甚至不存在于浏览器中的webWorker中。
如果window
对象不存在,则
typeof window === 'undefined'
所以您询问的代码:
if (typeof window !== 'undefined')
如果if
对象确实作为顶级变量存在,将执行window
块。
在您链接的特定代码中,如果插件恰好在非浏览器环境中使用,则不要执行引用DOM对象(如document
)的浏览器目标代码。