在前端开发中,我们经常需要使用全局对象,比如 window
对象在浏览器环境中负责管理全局作用域。然而,由于不同的 JS 运行环境,全局对象的名称不同,如在 Node.js 环境中,全局对象为 global
。这就给开发者带来了不便,尤其是需要跨平台编写代码的情况下。为了解决这个问题,ES11 新增了一个全局对象 globalThis
。
globalThis 对象是什么?
globalThis 在 ES11 中被定义为一个全局对象,它可以在任何地方(全局作用域和函数作用域中)使用,其属性和方法对于任何 JS 运行环境都是一致的。在浏览器环境下,它指向的就是 window
对象,在 Node.js 环境中,它指向的就是 global
对象。
当我们在全局和函数作用域中都需要使用全局变量或对象时,我们可以使用 globalThis
来代替具体的全局对象,从而提高代码的可移植性,例如:
// 在浏览器和 Node.js 中均可运行 globalThis.setTimeout(() => { console.log("Hello, world!"); }, 1000);
globalThis 对象的示例
在实践中,我们可以使用 globalThis
对象来执行一些 JS 运行环境通用的操作。
判断环境
有时候,我们需要根据代码运行的环境来做出一些不同的处理,比如在浏览器环境中,我们需要在 DOMContentLoaded
事件触发后再执行我们的代码,而在 Node.js 环境中,则没有这个事件。这时,我们可以使用 globalThis
对象来判断环境。
-- -------------------- ---- ------- -- ------- ------------------- --- ------------ - -- ----- -------------------------------------------------------- -- -- - ------------------- --------- --- - ---- - -- ------- -- ------------- -- - ------------------- --------- -- ------ -
跨平台调用
假设我们要在浏览器环境中调用 Node.js 模块中的方法,或者在 Node.js 环境中调用浏览器中的 API,我们可以使用 globalThis
对象来解决这个问题。
// 浏览器环境 globalThis.importScripts("node_module.js"); // Node.js 环境 globalThis.require("browser_api.js");
如何使用 globalThis?
在编写代码时,我们可以直接使用 globalThis
和具体的全局对象进行比较,例如:
if (globalThis === window) { // 在浏览器环境中执行 console.log("In browser"); } else { // 在 Node.js 环境中执行 console.log("In Node.js"); }
同时,我们可以使用 Object.is()
方法进行比较,代码如下:
if (Object.is(globalThis, window)) { // 在浏览器环境中执行 console.log("In browser"); } else { // 在 Node.js 环境中执行 console.log("In Node.js"); }
总结
globalThis 对象是 ES11 新增的一个全局对象,用于解决跨平台编写代码时,全局对象名称不一致的问题。任何 JS 运行环境都可以使用 globalThis
对象来进行操作,提高了代码的可移植性。我们可以通过比较 globalThis
和具体的全局对象来判断当前代码运行的环境,同时也可以使用 globalThis
进行跨平台调用。在实际开发中,我们应该充分利用 globalThis
对象,提高代码的可维护性和可移植性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645a0647968c7c53b0c25673