globalThis 是 ES2020 引入的标准化全局属性,统一指向各环境(浏览器 window、Node.js global、Web Worker self)的全局对象,解决跨平台环境检测难题,支持严格模式与模块作用域,需注意兼容性并推荐 polyfill 降级。

globalThis 是 JavaScript 中一个标准化的全局属性,它始终指向当前执行环境的全局对象。它的核心价值在于——用同一个名字,安全访问任何环境下的全局对象,无需再为浏览器(window)、Node.js(global)、Web Worker(self)或旧版 IE(frameElement等)写条件判断。
为什么需要 globalThis?
在 ES2020 之前,不同运行环境使用不同的全局对象引用:
- 浏览器主线程:用
window - Node.js:用
global - Web Worker / Service Worker:用
self - 严格模式下的函数中:
this不再指向全局对象,而是undefined
这导致跨平台库(如 polyfill、工具函数)必须写一堆环境检测逻辑,既繁琐又容易出错。globalThis 就是为终结这种碎片化而生的标准方案。
globalThis 的行为特点
它不是变量,也不是语法关键字,而是一个只读属性,存在于所有合规的 JavaScript 环境中(ES2020+):
立即学习“Java免费学习笔记(深入)”;
- 在浏览器中,
globalThis === window为true - 在 Node.js 中,
globalThis === global为true - 在 Web Worker 中,
globalThis === self为true - 它在模块作用域、函数作用域、严格模式下都可用且稳定
如何安全地使用 globalThis?
直接访问即可,但要注意兼容性与降级策略:
- 现代项目(支持 ES2020):直接用
globalThis.MyLib = {...}挂载全局工具 - 需兼容老环境时,可用简洁 fallback:
const safeGlobal = globalThis || self || window || global;
不过更推荐使用 polyfill(如 core-js 提供的),它会在不支持的环境中自动补全 globalThis 定义。
典型使用场景
常见于需要操作全局环境的底层代码中:
- 动态创建全局变量(如 polyfill 注入):
globalThis.Promise ??= MyPolyfillPromise; - 检测全局特性是否存在:
if (!globalThis.AbortController) { ... } - 在模块中安全暴露 API:
globalThis.myUtility = utilityFn; - 避免
this绑定陷阱:在箭头函数或严格模式下,不再依赖this获取全局对象











