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

What's the purpose of if (typeof window !== 'undefined')

本文关键字:是什么 undefined window if typeof      更新时间:2023-09-26

调用

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

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

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

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

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

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

  • 在所有JavaScript上下文中,都有一组标准的对象可用,例如:
    • MathDate
    • Object, Number, Function, String等(表示内置类型的对象),等等
  • 在一个网页的脚本(<script>标签内):
      Window(接口)暴露为window全局对象,这也是全局作用域的对象(因此在全局作用域中声明var foo实际上创建了一个属性window.foo !)
  • 所以document全局对象实际上是在访问window.document属性。
  • 在Node.js服务器端脚本中:
    • 由于Node.js不是一个带有DOM的web浏览器,没有window全局对象也没有像documentnavigator这样的属性,而是Node.js通过全局对象暴露其API,如:
      • console
      • process
      • exports
  • 在网页的Web Worker脚本中:
    • 在Web Worker中也没有window对象,所以全局作用域是一个WindowOrWorkerGlobalScope对象,它通过如下属性暴露了浏览器提供的对象:
      • caches
      • indexedDB
      • origin
  • 在IIS活动服务器页面使用JScript(而不是VBScript):
      response(用于写入响应流)
  • request(用于读取传入的HTTP请求)
  • ApplicationSession(用于在请求之间持久化数据)
  • 在微软Windows的Shell脚本主机
    • WScript全局对象暴露脚本主机的功能。
  • 这可以用来检测代码是否在一个典型的浏览器环境中运行(例如一个有浏览器DOM的环境)或在其他一些JS环境中运行,因为window对象存在于一个典型的浏览器JS中,但不存在于node.js甚至浏览器中的webWorker中。

    如果window对象不存在,则

    typeof window === 'undefined'
    

    所以你问的代码:

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

    将执行if块。

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