【发布时间】:2015-09-16 02:52:50
【问题描述】:
【问题讨论】:
-
对于该代码的作者,正如使用的那样,它在问:“我是在 chrome 还是 node.js 中运行?”...这个漂亮的混合代码在 JavaScript 运行的“两个”地方都有效。 讽刺>
标签: javascript jspm
【问题讨论】:
标签: javascript jspm
检查脚本是否在网络浏览器内的网页中运行是一种惯用的检查。
人们可能会认为 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 这样的属性,但您确实可以获得其他全局对象,例如:consoleprocessexportswindow 对象,因此全局范围是 WindowOrWorkerGlobalScope 对象,它通过以下属性公开对象:cachesindexedDBoriginresponse(用于写入响应流)request(用于读取传入的 HTTP 请求)Application 和 Session(用于在请求之间持久化数据)WScript 全局对象公开脚本宿主的功能。【讨论】:
'undefined' 相等,对吧?那是!== 不是!=
window 对象的类型,由typeof 运算符返回,将等于字符串'undefined'。
undefined 不可变。 typeof 永远是安全的。
这可用于检测代码是在典型的浏览器环境(例如具有浏览器 DOM 的环境)还是在其他一些 JS 环境中运行,因为 window 对象存在于典型的浏览器 JS 中,但不存在在诸如 node.js 甚至浏览器中的 webWorker 之类的东西中。
如果window对象不存在,那么
typeof window === 'undefined'
所以你问的代码:
if (typeof window !== 'undefined')
如果window 对象确实作为顶级变量存在,则将执行if 块。
在您链接的特定代码中,如果插件碰巧在非浏览器环境中使用,则要避免执行引用 DOM 对象(如 document)的面向浏览器的代码。
【讨论】:
Workers() 的评论来自哪里?我什么都没说Workers()。
window 对象的存在。这本身可以告诉您 DOM 及其相关对象是否可能存在(与 node.js 相比,它们不存在),但它不能告诉您您可能想知道的有关您的环境的所有信息。环境中的其他一些事情可能需要其他测试(这不是问题的主题)。并且,在具体引用的代码中,是用来决定DOM是否可以使用的。