Skip to content

获取全局对象

在以前,从不同的 JavaScript 环境中获取全局对象需要不同的语句。在 Web 中,可以通过 window、self 或者 frames 取到全局对象,但是在 Web Workers 中,只有 self 可以。在 Node.js 中,它们都无法获取,必须使用 global。

在松散模式下,可以在函数中返回 this 来获取全局对象,但是在严格模式和模块环境下,this 会返回 undefined。你也可以使用 Function('return this')(),但那些禁用eval()的环境,如在浏览器中的CSP,不允许这样使用Function。

js
// 不使用严格模式

(function () { return this})() // window / global

// 使用严格模式
'use strict'
(function () { return this})() // undefined
Function('return this')() // window / global

lodash 中的实现

在阅读lodash源码中的debounce和throttle时发现lodash中获取全局对象巧妙的实现。

源码

freeGlobal.js 源码位置:https://github.com/lodash/lodash/blob/master/.internal/freeGlobal.js

js
/** Detect free variable `global` from Node.js. */
const freeGlobal = typeof global === "object" && global !== null && global.Object === Object && global

export default freeGlobal

root.js

源码位置:https://github.com/lodash/lodash/blob/master/.internal/root.js

js
/* global globalThis, self */
import freeGlobal from './freeGlobal.js'

/** Detect free variable `globalThis` */
const freeGlobalThis = typeof globalThis === 'object' && globalThis !== null && globalThis.Object == Object && globalThis

/** Detect free variable `self`. */
const freeSelf = typeof self === 'object' && self !== null && self.Object === Object && self

/** Used as a reference to the global object. */
const root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')()

export default root