globalThis
试试看
值
全局 this
对象。
globalThis 的属性特性 |
|
---|---|
可写 | 是 |
可枚举 | 否 |
可配置 | 是 |
注意:globalThis
属性是可配置和可写的,以便代码作者在执行不受信任的代码时隐藏它,并防止暴露全局对象。
描述
从历史上看,访问全局对象需要在不同的 JavaScript 环境中使用不同的语法。在 Web 上,您可以使用 window
、self
或 frames
- 但在 Web Workers 中,只有 self
会起作用。在 Node.js 中,这些都不起作用,您必须改为使用 global
。this
关键字可以在非严格模式下运行的函数内部使用,但 this
在模块和严格模式下运行的函数内部将为 undefined
。您还可以使用 Function('return this')()
,但禁用 eval()
的环境(例如浏览器中的 CSP)会阻止以这种方式使用 Function
。
globalThis
属性提供了一种标准的方式来访问跨环境的全局 this
值(以及全局对象本身)。与 window
和 self
等类似属性不同,它保证在窗口和非窗口上下文中都能工作。这样,您可以以一致的方式访问全局对象,而无需知道代码在哪个环境中运行。为了帮助您记住名称,只需记住在全局范围内,this
值为 globalThis
。
注意:globalThis
通常与全局对象的概念相同(即向 globalThis
添加属性会使其成为全局变量)——对于浏览器和 Node 来说都是如此——但主机允许提供与全局对象无关的 globalThis
的不同值。
HTML 和 WindowProxy
在许多引擎中,globalThis
将是实际全局对象的引用,但在 Web 浏览器中,由于 iframe 和跨窗口安全性的考虑,它引用了实际全局对象周围的 Proxy
(您无法直接访问)。这种区别在普通使用中很少相关,但需要注意。
命名
其他一些流行的名称选择,如 self
和 global
,由于可能破坏与现有代码的兼容性而被排除在考虑之外。有关更多详细信息,请参阅 语言提案的“命名”文档。
globalThis
从字面上看就是全局 this
值。它与在没有对象的情况下调用的非严格函数中的 this
值相同。它也是脚本全局范围中 this
的值。
示例
跨环境搜索全局
通常,不需要显式指定全局对象——它的属性会自动作为全局变量访问。
console.log(window.Math === Math); // true
但是,需要显式访问全局对象的一种情况是写入它,通常是为了 polyfill。
在 globalThis
之前,获取环境全局对象的唯一可靠的跨平台方法是 Function('return this')()
。但是,这在某些设置中会导致 CSP 违规,因此作者会使用如下分段定义(略微改编自 原始 core-js 源代码)
function check(it) {
// Math is known to exist as a global in every environment.
return it && it.Math === Math && it;
}
const globalObject =
check(typeof window === "object" && window) ||
check(typeof self === "object" && self) ||
check(typeof global === "object" && global) ||
// This returns undefined when running in strict mode
(function () {
return this;
})() ||
Function("return this")();
获得全局对象后,我们可以在其上定义新的全局变量。例如,添加 Intl
的实现
if (typeof globalObject.Intl === "undefined") {
// No Intl in this environment; define our own on the global scope
Object.defineProperty(globalObject, "Intl", {
value: {
// Our Intl implementation
},
enumerable: false,
configurable: true,
writable: true,
});
}
有了 globalThis
,跨环境搜索全局变量不再必要了
if (typeof globalThis.Intl === "undefined") {
Object.defineProperty(globalThis, "Intl", {
value: {
// Our Intl implementation
},
enumerable: false,
configurable: true,
writable: true,
});
}
规范
规范 |
---|
ECMAScript 语言规范 # sec-globalthis |
浏览器兼容性
BCD 表格仅在浏览器中加载