ES11 新特性解析:全局对象 globalThis

ES11(也称 ES2020)是 ECMAScript(简称 ES)的最新版本。其中有许多新特性,其中一个较为常用的是全局对象 globalThis。在这篇文章中,我们将深入解析这个新特性,讨论它的用法和指导意义。

全局对象 globalThis 是什么?

全局对象是所有环境都能够访问的一个对象。在浏览器环境中,全局对象就是 window 对象;在 Node.js 环境中,全局对象是 global 对象。

但是,在不同的环境中使用不同的全局对象会导致一些问题。例如,如果我们使用许多 ECMAScript 规范中定义的内置函数和对象,它们的名称可能因环境不同而变化(例如在浏览器中使用 window.fetch(),但在 Node.js 中需要用到其他名称)。这就使得代码的可移植性变得更加复杂。

因此,ES11 引入了一个新的全局对象 globalThis,它解决了上述的问题。无论我们在什么环境下使用它,它都是相同的对象。

如何使用全局对象 globalThis?

使用 globalThis 对象非常简单。我们只需要像这样引用它:

----------------------- ---------
----------------------------------------

这段代码在任何环境下都能工作,因为 globalThis 指向的是全局对象,其名称不会因环境而变化。

需要注意的是,在一些旧版的浏览器和 Node.js 版本中并不支持全局对象 globalThis。不过,可以通过 polyfill 的方式来提供支持。例如,在浏览器环境中,可以使用如下的代码:

--------------- -
  --------- ------ --- ------------ -
    ---------- - -------
  - ---- --------- ---- --- ------------ -
    ---------- - -----
  - ---- -
    ----- --- ------------- ---- ------ ---------
  -
-

全局对象 globalThis 的指导意义

全局对象 globalThis 统一了不同环境下的全局对象名称,使得我们可以编写更具可移植性的代码。此外,它还有以下的一些用处:

1. 在嵌套环境下引用全局对象

对于 JavaScript 来说,全局变量和全局对象通常是相同的。但是,在某些情况下,我们可能会遇到嵌套的情况,例如在不同的 iframe 或 Worker 中渲染代码。在这种情况下,如果我们想要访问最外层的全局变量,我们需要使用 window.top 或 self.top,不过这会使我们的代码不可移植。通过使用全局对象 globalThis,我们的代码就能够在不同的嵌套环境下正常工作了。

2. 在函数中引用全局对象

在一些情况下,我们可能需要在函数中使用全局变量。在旧版的 JavaScript 中,我们需要使用 window 对象来访问全局变量。但是,如果我们的代码在其他环境中运行,可能会遇到 window 未定义的情况。现在,我们可以使用 globalThis 来引用全局变量,这将使我们的代码更加通用。

3. 编写可重用的库

对于那些编写库的开发者来说,全局对象 globalThis 对于实现可重用性非常有帮助。例如,库作者可以编写一个全局对象来引用库本身,并将这个对象暴露给用户。这样,即使库的名称在不同的环境下发生了变更,用户仍然能够方便地引用它。

示例

下面是一个简单的示例,展示如何使用全局对象 globalThis 在不同的环境中访问到 position 对象。

-- ------ -------- -----
-------- ------------- -
  ------ -------------------------------------------------------- -- -----
-

-- -------
--------------------------- -- --------------- - -

-- - ------- ---
--------------------------- -- ---------- ------ ---- -------- -------------------- -- ---------

在这个例子中,我们使用了 optional chaining 和 nullish coalescing 运算符,它们是 ES11 中另外两个有用的新特性。更多关于这些特性的信息,请参考官方文档。

结论

全局对象 globalThis 是 ECMAScript 2020 中的一个重要新特性,它解决了在不同环境下全局对象名称变化的问题,使得我们可以编写更具可移植性的代码。同时,我们应该注意一些旧版环境中不支持 globalThis 的问题,可以通过 polyfill 来解决。希望这篇文章对你有所帮助,让你更好地理解全局对象 globalThis 的使用和指导意义。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6715bfbfad1e889fe218bc3b