详解 ES12 中全局对象 globalThis
在过去,JavaScript 中访问全局对象的方法因不同的运行环境而异,例如 Node.js 中的全局对象是 global
,而浏览器中的全局对象则是 window
。ES12 中增加了一个全新的全局对象 globalThis
,它可以在所有环境中使用,无论是浏览器还是 Node.js 等其他的 JavaScript 运行环境。
globalThis 简介
globalThis 是一个代表全局环境的对象,它的属性和方法是全局范围内的,可以直接通过名称访问。例如,浏览器中可以通过以下方式访问全局对象:
window.console.log('Hello, World!');
而使用 globalThis 则可以将代码改写为:
globalThis.console.log('Hello, World!');
这样就可以在任何环境中访问全局对象,而无需担心具体的运行环境。
globalThis 在 Node.js 中的应用
在 Node.js 中,globalThis 对象的作用和在浏览器中是一样的,它提供了一个在所有模块中访问全局变量的通用方法。在 Node.js 中,可以使用以下方式访问 globalThis 对象并设置全局变量:
globalThis.myVar = 'Hello, World!';
然后,在其他的 Node.js 模块中可以直接访问该全局变量:
console.log(myVar); // 输出 "Hello, World!"
这种方式既优雅又安全,因为它避免了使用 Node.js 中不安全的全局对象 global
。
globalThis 在浏览器中的应用
在浏览器中,globalThis 对象的应用也非常广泛,主要是在以下场景中使用:
- 在 Web Workers 中访问全局变量;
- 在不同的 JavaScript 构建工具中共享数据。
在 Web Workers 中,没有全局变量 window
,因此无法直接访问全局变量。通过 globalThis 对象,可以在 Web Workers 环境中访问全局变量:
globalThis.myVar = 'Hello, World!';
然后,在 Web Workers 中可以直接访问该全局变量:
console.log(myVar); // 输出 "Hello, World!"
在不同的 JavaScript 构建工具中,可以利用 globalThis 对象共享数据,例如一个项目中多个 JavaScript 文件之间需要共享数据时,可以将这些数据添加到 globalThis 中,然后在其他文件中直接访问这些数据:
globalThis.myData = { name: '张三', age: 18 };
然后,在其他的 JavaScript 文件中可以直接使用这些数据:
console.log(myData.name); // 输出 "张三" console.log(myData.age); // 输出 18
ES12 其他全局变量的变动
随着 ES12 中全局对象 globalThis 的引入,也带来了其他全局变量的改变,例如 eval
和 Function
。在 ES11 中,为了提高安全性,eval
和 Function
在默认情况下不能访问全局作用域中的变量和函数。在 ES12 中,这两个全局变量的默认行为被修改,可以访问全局作用域中的变量和函数了。
总结
globalThis 对象的出现,使得 JavaScript 中全局对象访问变得更加统一和简单。它的应用也非常广泛,不仅可以在 Node.js 和浏览器中使用,还可以在 Web Workers 和不同的 JavaScript 构建工具中共享数据。将来,我们可以预期更多使用 JavaScript 的环境也将支持 globalThis 对象,为使用全局对象提供更加优秀的解决方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/644fb812980a9b385b90e3dd