ES11 之 globalThis 对象和现代 JavaScript 中的全局状态

在现代前端开发中,我们经常需要在不同的代码模块中访问全局状态,比如说在不同的函数中设置或者读取一些全局变量。但是,在 JavaScript 中,全局变量容易被意外修改或者污染,这可能会导致一些意外的错误。因此,ES11 提供了一个新的特性,即全局对象 globalThis,来规范化 JavaScript 中的全局状态管理。

什么是 globalThis 对象

globalThis 对象是 ES11 新增的全局对象,它提供了一个标准的方式来访问全局环境,而不用担心代码在不同的上下文中执行时,全局对象的实际名称和使用方法可能会不同。globalThis 对象可以在任何上下文中使用,包括浏览器中的窗口对象、Worker 线程、Node.js 等等。

在普通的浏览器环境中,globalThis 对象等价于 window 对象。在 Node.js 中,globalThis 对象等价于全局对象 global。在各种 JavaScript 运行时环境中,无论是 Web Worker、Node.js 还是浏览器中的 iframe,globalThis 都可以正确地访问全局环境中的变量和函数。

globalThis 对象的优点

globalThis 对象的出现解决了 JavaScript 中全局变量管理的一些问题,带来了以下一些优点:

  • 统一的全局变量访问方式:无论在什么环境下,都可以使用一个固定的名称和使用方法来访问全局变量。
  • 更加安全的全局变量管理:globalThis 不仅可以访问全局变量,还可以访问全局函数和全局属性。但不像 windowglobal 对象,globalThis 对象无法被其他脚本重新赋值,这使得全局变量更加安全。
  • 便于跨平台开发:如果需要编写跨平台代码,可以使用 globalThis 来实现对不同环境中的全局变量的访问。

如何使用 globalThis 对象

在大多数情况下,使用 globalThis 对象的语法与使用 window 或者 global 对象的语法相同。比如说,在浏览器环境中,可以使用以下代码来访问全局变量:

在 Node.js 中,同样可以使用 globalThis 对象来访问全局变量:

一个使用 globalThis 对象的示例

为了更好地理解 globalThis 对象的用法,下面介绍一个具体的示例。假设我们想要在不同的模块中访问全局状态,比如说一个计时器,我们可能会写出如下的代码:

这段代码定义了一个计时器模块 timer.js,其中的 count 变量用来计数,start 函数用来循环输出计数的结果。在 main.js 中,我们需要调用 start 函数来启动计时器。

但是,这段代码存在一个问题:如果我们在其他模块中也需要访问 count 变量,该如何实现呢?如果直接使用 count 变量,访问的是当前模块的变量,而非全局变量。我们可能会尝试将 count 变量放到全局作用域中,但是这样会使得代码变得不够安全。

通过使用 globalThis 对象,我们可以很容易地解决这个问题。具体地,我们可以将 count 变量作为 globalThis 对象的属性来使用。这样,全局变量就可以在不同的模块中使用,而且不能被其他脚本重写。

这个版本的代码不再需要我们在其他模块中访问 count 变量时做出任何更改,而是直接使用 globalThis.count 即可。同时,我们也不需要将变量放到全局作用域中,而是将其赋值给 globalThis.count 属性即可。这样,全局变量就更加安全了,因为不能被其他脚本重写。

总结

globalThis 对象是 ES11 新增的一个全局对象,为 JavaScript 中的全局变量管理带来了一些优点。通过使用 globalThis 对象,我们可以统一地访问全局状态,使得代码更加易于维护和扩展。同时,使用 globalThis 也可以更加安全地管理全局变量,避免出现一些意外的错误。

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


纠错
反馈