获取全局对象
在以前,从不同的 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