前言
在 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