globalThis

全局属性globalThis 包含全局的 this 值,类似于全局对象(global object)

globalThis 属性的属性特性:
writable true
enumerable false
configurable true

语法

globalThis

描述

事实上,在不同的 JavaScript 环境中拿到全局对象是需要不同的语句的。在 Web 中,可以通过 windowself 或者 frames 取到全局对象,但是在 Web Workers 中只有 self 可以。在 Node.js 中,它们都无法获取,必须使用 global。在松散模式下,可以在函数中返回 this 来获取全局对象,但是在严格模式下 this 会返回 undefined 。

globalThis 提供了一个标准的方式去获取不同环境下的全局对象。它不像 window 或者 self 这些属性,而是确保可以在有无窗口的环境下都可以正常工作。所以你可以安心的使用 globalThis ,不必担心它的运行环境。

便于记忆,你只需要记住全局对象自己 翻译过来就是 globalThis

HTML 与 WindowProxy

在很多引擎中, globalThis 被认为是真实的全局对象的引用,但是在浏览器中,由于iframe以及跨窗口安全性的考虑,它实际引用的是真实全局对象(不可以被直接访问)的Proxy代理。这种区别在通常的应用中很少涉及到。但是也需要加以注意。

命名

此特性曾经在提案时命名为 global,但有些网站会因此运行不正常,所以改名为 globalThis 了。

示例

globalThis 之前,获取某个全局对象的唯一方式就是 Function('return this')(),但是这在某些情况下会导致 CSP 危害,所以 es6-shim 使用如下的方式:

var getGlobal = function () { 
  if (typeof self !== 'undefined') { return self; } 
  if (typeof window !== 'undefined') { return window; } 
  if (typeof global !== 'undefined') { return global; } 
  throw new Error('unable to locate global object'); 
}; 

var globals = getGlobal(); 

if (typeof globals.setTimeout !== 'function') { 
  // no setTimeout in this environment! 
}

但是有了 globalThis 之后,只需要:

if (typeof globalThis.setTimeout !== 'function') {
  // no setTimeout in this environment!
}

规范

规范
ECMAScript Latest Draft (ECMA-262)
globalThis

浏览器兼容性

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
globalThisChrome Full support 71Edge No support NoFirefox Full support 65IE No support NoOpera No support NoSafari Full support 12.1WebView Android Full support 71Chrome Android Full support 71Firefox Android Full support 65Opera Android No support NoSafari iOS Full support 12.2Samsung Internet Android Full support 10.0nodejs Full support 12.0.0

Legend

Full support  
Full support
No support  
No support

实现进度

下表提供了此特性的每日实施状态,因为该功能尚未达到跨浏览器的稳定性。 通过在每个浏览器的JavaScript引擎的daily版本或最新版本中运行Test262(JavaScript的标准测试套件)中的相关功能测试得到了如下数据。