使用 ES11 新特性可靠地选择 JavaScript 的 “this” 指针

阅读时长 4 分钟读完

前言

在 JavaScript 的代码中,this 关键字很容易导致一些问题,因为它不总是指向你希望它指向的那个对象。

理解 this 的指向是尤其复杂的,尤其是当你将函数作为参数传递到另一个函数中,或者使用箭头函数时。

但是,ES11 引入了一个新的功能,可以使我们更可靠地控制 this 的指针,这个新功能就是“可选的成员调用操作符”。

在本文中,我们将介绍当 this 变得棘手时如何使用这个新功能来更好地控制它。

什么是 this

在 JavaScript 中,this 关键字指向当前函数的作用域。这意味着它可能是全局对象(如果在全局作用域中使用),也可能是调用该函数的对象。

但在某些情况下,这个指向可能会出现问题。例如,当您将函数作为参数传递给另一个函数时,新的函数将创建自己的作用域,而 this 指向也会随之改变。

什么是可选的成员调用操作符?

ES11 引入了可选成员调用操作符,这是一个新的语法,它使我们能够在不确定一个对象是否存在的情况下,使用它的属性或者方法。

-- -------------------- ---- -------
----- --- - -
  ---- -
    ---- -
      ---- ---
    --
  --
--

-------------------------------- -- --

在上面的示例中,我们将 obj 对象中的 foo.bar.baz 输出到控制台。但是,如果对象的结构发生了变化,例如移除了 foo 对象,那么访问 obj.foo.bar.baz 将会报错。

我们可以使用可选成员操作符 ? 来解决这个问题。当 obj.foo 不是一个对象时,会返回 undefined,而不是一个错误。

不支持可选成员调用操作符的旧浏览器将会抛出一个语法错误,可以通过 babel 转换来解决这个问题。

如何使用可选的成员调用操作符来控制 this

在 JavaScript 中,this 关键字指向调用它的函数的作用域,而不是函数的定义作用域。这意味着,在以下情况下,可能会出现问题:

-- -------------------- ---- -------
----- --- - -
  --- ---
  ---- -------- -- -
    ---------------------
  --
--

----- --- - -
  --- --
--

----- --- - --------

------ -- ---------
------- - --------
---------- -- -

在上面的示例中,我们定义了一个带有 foo 方法的 obj 对象,该方法引用了 this.id。我们还定义了另一个具有 id 属性的 bar 对象,并将 obj.foo 方法分配给 bar 对象的 foo 属性。

当我们将 obj.foo 赋值给 foo 变量时,this 的指向丢失了 id,因为 foo 函数的调用方式已经与 obj 对象分离了。

同样的,当我们将 obj.foo 分配给 bar.foo 后,this 仍然指向了 bar 对象而不是 obj 对象。

这时,可选的成员调用操作符可以派上用场,例如:

-- -------------------- ---- -------
----- --- - -
  --- ---
  ---- -------- -- -
    ----------------------
  --
--

----- --- - -
  --- --
--

----- --- - --------

------ -- ---------
------- - --------
---------- -- -

在上面的示例中,我们在 console.log() 中加入了 this?.,它表示如果 this 存在,则使用它的 id 属性。这样,即使在 foo() 调用与 obj 对象分离的情况下,我们也可以在 console.log() 中访问 id 属性。

同样的,当我们将 obj.foo 分配给 bar.foo 后,this 仍然指向了 bar 对象而不是 obj 对象。

结论

在本文中,我们介绍了 this 关键字和可选的成员调用操作符,以及它们如何共同解决 JavaScript 中 this 关键字问题的一些方面。

我们发现,使用可选的成员操作符可以让我们更可靠地控制 this 的指向。这个功能对于将函数作为参数传递给另一个函数或使用箭头函数时特别有用。

我们希望本文能够帮助您更好地理解 this 指针,以及如何在代码中可靠地选择它。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f2516fa44b36ee57657193

纠错
反馈