globalThis

发布于 · 标签:ECMAScript ES2020

如果您之前编写过在 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 模块,您可以声明式地 importexport 功能,而不是弄乱全局状态。globalThis 仍然对需要全局访问的 polyfill 和其他库有用。

globalThis 支持 #