如果您之前编写过在 Web 浏览器中使用的 JavaScript 代码,您可能使用过 window
来访问全局 this
。在 Node.js 中,您可能使用过 global
。如果您编写了必须在任一环境中运行的代码,您可能已经检测到其中哪一个可用,然后使用它 - 但要检查的标识符列表会随着您想要支持的环境和用例数量而增长。它很快就会失控。
// A naive attempt at getting the global `this`. Don’t use this!
const getGlobalThis = () => {
if (typeof globalThis !== 'undefined') return globalThis;
if (typeof self !== 'undefined') return self;
if (typeof window !== 'undefined') return window;
if (typeof global !== 'undefined') return global;
// Note: this might still return the wrong result!
if (typeof this !== 'undefined') return this;
throw new Error('Unable to locate global `this`');
};
const theGlobalThis = getGlobalThis();
有关上述方法为何不足(以及更复杂的技术)的更多详细信息,请阅读 通用 JavaScript 中令人恐惧的 globalThis
polyfill。
globalThis
提案 引入了一种统一机制,用于在任何 JavaScript 环境(浏览器、Node.js 或其他?)中访问全局 this
,无论脚本目标(经典脚本还是模块?)。
const theGlobalThis = globalThis;
请注意,现代代码可能根本不需要访问全局 this
。使用 JavaScript 模块,您可以声明式地 import
和 export
功能,而不是弄乱全局状态。globalThis
仍然对需要全局访问的 polyfill 和其他库有用。
globalThis
支持 #
- Chrome: 从版本 71 开始支持
- Firefox: 从版本 65 开始支持
- Safari: 从版本 12.1 开始支持
- Node.js: 从版本 12 开始支持
- Babel: 支持