globalThis

**globalThis** 全局属性包含 全局 this 值,通常类似于 全局对象

试试看

全局 this 对象。

globalThis 的属性特性
可写
可枚举
可配置

注意:globalThis 属性是可配置和可写的,以便代码作者在执行不受信任的代码时隐藏它,并防止暴露全局对象。

描述

从历史上看,访问全局对象需要在不同的 JavaScript 环境中使用不同的语法。在 Web 上,您可以使用 windowselfframes - 但在 Web Workers 中,只有 self 会起作用。在 Node.js 中,这些都不起作用,您必须改为使用 globalthis 关键字可以在非严格模式下运行的函数内部使用,但 this 在模块和严格模式下运行的函数内部将为 undefined。您还可以使用 Function('return this')(),但禁用 eval() 的环境(例如浏览器中的 CSP)会阻止以这种方式使用 Function

globalThis 属性提供了一种标准的方式来访问跨环境的全局 this 值(以及全局对象本身)。与 windowself 等类似属性不同,它保证在窗口和非窗口上下文中都能工作。这样,您可以以一致的方式访问全局对象,而无需知道代码在哪个环境中运行。为了帮助您记住名称,只需记住在全局范围内,this 值为 globalThis

注意:globalThis 通常与全局对象的概念相同(即向 globalThis 添加属性会使其成为全局变量)——对于浏览器和 Node 来说都是如此——但主机允许提供与全局对象无关的 globalThis 的不同值。

HTML 和 WindowProxy

在许多引擎中,globalThis 将是实际全局对象的引用,但在 Web 浏览器中,由于 iframe 和跨窗口安全性的考虑,它引用了实际全局对象周围的 Proxy(您无法直接访问)。这种区别在普通使用中很少相关,但需要注意。

命名

其他一些流行的名称选择,如 selfglobal,由于可能破坏与现有代码的兼容性而被排除在考虑之外。有关更多详细信息,请参阅 语言提案的“命名”文档

globalThis 从字面上看就是全局 this 值。它与在没有对象的情况下调用的非严格函数中的 this 值相同。它也是脚本全局范围中 this 的值。

示例

跨环境搜索全局

通常,不需要显式指定全局对象——它的属性会自动作为全局变量访问。

js
console.log(window.Math === Math); // true

但是,需要显式访问全局对象的一种情况是写入它,通常是为了 polyfill

globalThis 之前,获取环境全局对象的唯一可靠的跨平台方法是 Function('return this')()。但是,这在某些设置中会导致 CSP 违规,因此作者会使用如下分段定义(略微改编自 原始 core-js 源代码)

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 的实现

js
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,跨环境搜索全局变量不再必要了

js
if (typeof globalThis.Intl === "undefined") {
  Object.defineProperty(globalThis, "Intl", {
    value: {
      // Our Intl implementation
    },
    enumerable: false,
    configurable: true,
    writable: true,
  });
}

规范

规范
ECMAScript 语言规范
# sec-globalthis

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅