这是一个惯用的检查方法,用于确定脚本是否在网页内运行在浏览器中。
人们可能会认为JavaScript只能在网页中运行,因为它最初就是为此而设计的,但这并不正确:JavaScript是一种多才多艺的语言,也可以用于编写Node.js或IIS的Active Server Pages(自1996年以来!)中的服务器端代码,或者在"Web Workers"中使用,这些是在后台运行的网页脚本。
在网页中,有几个固有对象,例如window
,其他环境(如Node.js)将没有window
,但可能有其他对象,如console
(现在大多数浏览器都存在console
,但最初并不存在)。
例如,在不同的上下文中,脚本的全局范围内可用的对象是不同的(此列表不是详尽无遗的):
在所有 JavaScript 上下文中,都可以使用一组标准对象,例如:Math
和 Date
Object
、Number
、Function
、String
等(表示内置类型的对象)等<script>
标签内)中:
Window
(接口)作为全局对象 window
公开,也是实际的全局作用域对象(因此在全局作用域中声明 var foo
实际上创建了属性 window.foo
!)document
全局对象实际上是访问 window.document
属性。window
全局对象或 document
或 navigator
之类的属性,而是通过全局对象公开其 API,例如:
console
process
exports
window
对象,因此全局作用域是一个 WindowOrWorkerGlobalScope
对象,该对象通过属性公开由浏览器提供的对象,例如:
caches
indexedDB
origin
response
(用于向响应流写入内容)request
(用于从传入的 HTTP 请求中读取内容)Application
和 Session
(用于在请求之间保留数据)WScript
全局对象公开了脚本主机的功能。window
对象的类型,由typeof
运算符返回的结果将等于字符串“undefined”。 - Maximillian Laumeisterif (window !== undefined)
能达到同样的效果吗?typeof
和字符串相等性检查是否必要? - SheffDoinWorkundefined
不可变。typeof
始终是安全的。 - Dai这可以用来检测代码是否在典型的浏览器环境中运行(例如,具有浏览器 DOM 的环境)还是在其他 JS 环境中运行,因为window
对象存在于典型的浏览器 JS 中,但在像 node.js 或甚至是浏览器中的 webWorker 中不存在。
如果window
对象不存在,则
typeof window === 'undefined'
所以你问的代码是:
if (typeof window !== 'undefined')
如果window
对象作为顶级变量存在,将执行if
块。
在您链接的特定代码中,这是为了防止在非浏览器环境中使用插件时执行引用DOM对象(如document
)的针对浏览器的代码。
Workers()
的评论是从哪来的? 我并没有说过Workers()
。 - jfriend00