在 JavaScript 中,许多对象依赖于上下文环境来确定其行为,例如在浏览器中的 window 对象或在 Node.js 环境中的 global 对象。在大多数情况下,这些对象是可以通过其他方式轻松地获取到的,但是当代码需要跨平台或运行在多个环境中时,由此带来的问题就会变得特别突出。
在 ES11 中,引入了一个新的全局对象 globalThis ,它提供了一种跨平台的访问全局对象的方法,并且可以更好地解决跨环境问题。
在不同环境下的全局对象
在浏览器中,全局对象通常是 window 对象,因为浏览器中的 JavaScript 运行在一个名为 window 的全局对象中。而在 Node.js 环境中,全局对象通常是 global 对象。
// in browser console.log(window); // in Node.js console.log(global);
然而,这种依赖于不同运行时环境的写法带来了许多问题。例如,如果你在一个库中正在开发一个函数,需要兼容不同的运行时环境,那么你可能会写这样的代码:
if (typeof window !== 'undefined') { // browser environment window.someFunction(); } else if (typeof global !== 'undefined') { // Node.js environment global.someFunction(); }
这段代码需要检测当前环境中存在的全局对象,并根据结果进行相应的处理。如果你的代码需要兼容多个平台,那么这个过程会变得非常繁琐。
globalThis 的解决方案
新的全局对象 globalThis 提供了一种统一的跨平台访问方式,不再需要进行诸如上面的条件判断了。在任何平台上,只需调用 globalThis 对象即可访问全局对象。
console.log(globalThis);
注意,在浏览器中,globalThis 等价于 window 。
console.log(globalThis === window); // true
而在诸如 Node.js 等其他平台中,globalThis 会指向当前全局对象(即 global )。
console.log(globalThis === global); // true
这就意味着,不管你的代码运行在哪个平台,你都可以使用 globalThis 对象来访问全局对象,而不用担心兼容性问题。
示例代码
下面是一些使用 globalThis 的示例代码,它们在不同平台上均能正常运行:
-- -------------------- ---- ------- -- ------ ------------------------------ -- ------ ----------------------------- - -------- -- ---------- ------------------------ -- - ------------------------ --- -- - ------ --- ----- ------ - --- -------------------- ------------------------ ----- ------ --- -- ---- ---------- -- ------- ----------- ----- ----------------- - --- ---------------------- -------------------------- ------------------------------ -- ---
结论
ES11 中新增的全局对象 globalThis,提供了一种跨平台访问全局对象的方法,解决了这个问题带来的不方便以及兼容性问题。它可以使开发者更加专注于逻辑实现,减少了代码冗余和繁琐的条件判断。无论是在浏览器端还是 Node.js 环境,都可以更方便地访问全局对象,提高开发效率和质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674953c1a1ce006354503665