在 ES11 中,新加入了 globalThis
对象,旨在提供一个标准的方法来获取全局对象(即 window
对象或者 global
对象等)。它与常见的 this
对象有着很大的不同,下面将详细介绍它们之间的区别。
globalThis
对象的定义
globalThis
对象是一个全局对象,它是在所有的 JavaScript 环境中都可用的,包括浏览器和 Node.js 等环境。它是指向全局对象的标准属性,因此通过它可以更加容易地访问到全局对象。
以下是一个获取全局对象的示例:
// 使用 globalThis 获取全局对象 const globalObject = globalThis; console.log(globalObject === window); // true console.log(globalObject === global); // true
这个示例中,我们使用 globalThis
获取了全局对象 window
和 global
,它们分别是浏览器环境和 Node.js 环境下的全局对象。
与 this
的不同点
它们的不同点主要在以下几个方面:
1. this
与作用域相关
this
指向当前函数的对象,它的值只与函数的调用方式有关。而 globalThis
指向全局对象,与作用域无关。
function test() { console.log(this); // 指向全局对象 } test(); console.log(globalThis); // 全局对象
当在全局范围内调用函数时,在 test()
函数中的 this
就会指向全局对象。而 globalThis
在任何情况下都指向全局对象。
2. this
与对象相关
this
是由对象调用函数时自动传递的,它的值将引用该对象。而 globalThis
没有这样的规则,它总是指向全局对象。
const obj = { foo() { console.log(this); // 指向 obj 对象 } }; obj.foo(); console.log(globalThis); // 全局对象
在上面的示例中,当 obj
对象调用 foo
函数时,它的 this
就会指向 obj
对象。而 globalThis
将引用全局对象。
3. this
与变量提升相关
this
与变量提升密切相关,如果在使用 this
时未定义该变量,程序将报错。而 globalThis
不需要变量提升,在任何时候都可以使用。
function test() { console.log(this); // Uncaught ReferenceError: this is not defined } test(); console.log(globalThis); // 全局对象
在上面的示例中,当 test
函数调用 this
对象时,程序将抛出错误,因为此时 this
未定义。而 globalThis
可以在任何时候使用,不需要变量提升。
总结
通过本文的介绍,我们可以看出 globalThis
与常见的 this
对象有很大的不同点。globalThis
指向全局对象,与作用域和对象无关,而 this
则与作用域和对象相关。我们需要了解这些区别,以便在正确的时候使用正确的对象。
如果我们在获取全局对象时,使用 globalThis
将是更好的选择。它能够在任何时候获取到全局对象,甚至在跨窗口或者跨域时也可以使用。而使用 this
则需要在正确的上下文中调用,否则可能会引发运行时错误。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e861cadd4f0e0ff76fc1f