ES12 中的 globalThis、self 和 window 的区别

在前端开发中,我们经常需要与浏览器窗口进行交互。为了实现这种交互,我们通常会使用 JavaScript 中的 window 对象,这是一个全局对象,提供了大量的浏览器 API。

但是,在 ES12 标准中,我们发现了一些新的全局对象,例如 globalThis 和 self。这些对象与 window 有什么区别呢?本文将介绍 ES12 中的这些全局对象,并且探讨它们之间的区别。

globalThis

globalThis 是 ES12 标准中新出现的一个全局对象,它被设计成一个可以在任何 JavaScript 环境中获取的全局对象,包括浏览器、Node.js 和 Web Worker。这意味着,不管你的 JavaScript 代码在哪个环境中运行,你都可以通过 globalThis 来访问全局对象。

从标准库的角度来看,globalThis 的作用类似于 window,因为它提供了许多浏览器 API。不同之处在于,window 只在浏览器环境中可用,而 globalThis 可以在浏览器和其他 JavaScript 环境中使用。

下面是一个示例代码,演示了如何使用 globalThis 来访问全局对象:

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

self

self 也是 ES12 标准中新增的一个全局对象,它是一个只读属性,指向当前执行的 WorkerGlobalScope,在非 Worker 环境下等价于 window。如果你不熟悉 Web Worker,可以简单理解为一个运行在后台线程中的 JavaScript 程序。

在浏览器中,如果从主程序中使用 self,它将返回 window 对象。如果从 Worker 中使用 self,它将返回当前的 WorkerGlobalScope 对象。

下面是一个示例代码,演示了如何在 Worker 中使用 self 访问全局对象:

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

window

window 通常是我们在前端开发中最常用的全局对象之一,因为它在浏览器环境中提供了大量的浏览器 API,例如 document、location 和 history 等。

从本质上讲,window 是 DOM 的根对象,是通过浏览器运行 JavaScript 代码时创建的。在浏览器环境中,window 包含了所有全局变量、函数和对象。这意味着,通过 window,我们可以访问到所有浏览器 API。

下面是一个示例代码,演示了如何在浏览器环境中使用 window 访问全局对象:

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

区别与应用

上面介绍了三个不同的全局对象:globalThis、self 和 window。它们之间的关系和区别如下:

globalThis:是一个可用于访问全局对象的标准库,可以跨浏览器和 Node.js 进行使用。

self:是一个只读属性,指向当前执行的 WorkerGlobalScope,在非 Worker 环境下等价于 window。

window:是浏览器环境中最常见的全局对象,提供了大量的浏览器 API。

在实际应用中,我们应该根据不同的场景选择不同的全局对象。如果在多个 JavaScript 环境中交互,可以使用 globalThis 来访问全局对象。如果需要与 Web Worker 进行交互,可以使用 self 来访问全局对象。而在浏览器环境中,我们通常会使用 window 来访问浏览器 API。

结论

ES12 中的 globalThis、self 和 window 三个全局对象都有着自己的作用和功能,应该在不同的场景中加以使用。

  • globalThis 是一个可用于访问全局对象的标准库,在任何 JavaScript 环境中都可以使用。

  • self 是一个只读属性,指向当前执行的 WorkerGlobalScope,在非 Worker 环境下等价于 window。

  • window 是浏览器环境中最常见的全局对象,提供了大量的浏览器 API。

通过深入了解这些全局对象,我们可以更好地理解 JavaScript 运行时的概念和机制,并且可以更好地选择适当的工具来实现我们的开发需求。

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