【问题标题】:What's the purpose of if (typeof window !== 'undefined')if (typeof window !== 'undefined') 的目的是什么
【发布时间】:2015-09-16 02:52:50
【问题描述】:

打电话的目的是什么

if (typeof window !== 'undefined') 

我在JSPM plugin-css 和其他一些库中看到了它。

【问题讨论】:

  • 对于该代码的作者,正如使用的那样,它在问:“我是在 chrome 还是 node.js 中运行?”...这个漂亮的混合代码在 JavaScript 运行的“两个”地方都有效。 讽刺>

标签: javascript jspm


【解决方案1】:

检查脚本是否在网络浏览器内的网页中运行是一种惯用的检查。

人们可能会认为 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 的网络浏览器,因此没有 window 全局对象,也没有像 documentnavigator 这样的属性,但您确实可以获得其他全局对象,例如:
    • console
    • process
    • exports
  • In a web-page's Web Worker script:
    • 在 Web Worker 中也没有 window 对象,因此全局范围是 WindowOrWorkerGlobalScope 对象,它通过以下属性公开对象:
    • caches
    • indexedDB
    • origin
  • 在使用 JScript(而不是 VBScript)的 IIS 活动服务器页面中:
    • response(用于写入响应流)
    • request(用于读取传入的 HTTP 请求)
    • ApplicationSession(用于在请求之间持久化数据)
  • 在 Microsoft Windows 的 Shell 脚本宿主中
    • WScript 全局对象公开脚本宿主的功能。

【讨论】:

  • 它仍然不会与字符串 'undefined' 相等,对吧?那是!== 不是!=
  • @Blindy window 对象的类型,由typeof 运算符返回,将等于字符串'undefined'
  • @sheffDoinWork 这是不安全的,因为直到最近 JS 引擎才使 undefined 不可变。 typeof 永远是安全的。
  • @SheffDoinWork 另外,至少在某些情况下,直接引用窗口实际上会给你一个“窗口未定义”错误。无论如何,这就是我在 Windows Script Host 中得到的。
  • @SheffDoinWork 在 JS 中,literal 字符串相等性检查与整数相等性检查一样快,因为 JS 字符串是不可变的,并且文字在解释器之前由解析器(或 JIT)甚至运行:所以它只是一个简单的指针比较。不要因为在 JS 中使用文字字符串而感到难过。
【解决方案2】:

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

如果window对象不存在,那么

typeof window === 'undefined'

所以你问的代码:

if (typeof window !== 'undefined') 

如果window 对象确实作为顶级变量存在,则将执行if 块。

在您链接的特定代码中,如果插件碰巧在非浏览器环境中使用,则要避免执行引用 DOM 对象(如 document)的面向浏览器的代码。

【讨论】:

  • @dandavis - 你对Workers() 的评论来自哪里?我什么都没说Workers()
  • @dandavis - 我不明白 webWorker 代码与这个问题有什么关系。对不起,但我只是不明白你的评论。此代码检测到类似浏览器的 window 对象的存在。这本身可以告诉您 DOM 及其相关对象是否可能存在(与 node.js 相比,它们不存在),但它不能告诉您您可能想知道的有关您的环境的所有信息。环境中的其他一些事情可能需要其他测试(这不是问题的主题)。并且,在具体引用的代码中,是用来决定DOM是否可以使用的。
  • 一个小问题是,并非所有浏览器 JS 都有一个 window 顶级对象,例如 Workers,但通常你是对的 ;)
猜你喜欢
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多