ES11 中新的 globalThis 对象和旧的 this 有何区别

在 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 获取了全局对象 windowglobal,它们分别是浏览器环境和 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


纠错反馈