透彻地搞懂 ES9 的 this 新特性和默认绑定!

阅读时长 4 分钟读完

在 JavaScript 中,this 是一个非常重要的概念。它用来表示当前执行上下文中的对象。但是,在一些情况下,this 的行为并不是我们所期望的。ES9 中引入了一些新的特性和默认绑定,帮助我们更好地理解和使用 this

默认绑定

当一个函数被调用时,如果没有明确指定 this 的值,那么 this 将会指向全局对象。这种情况下,我们称之为默认绑定。

在上面的例子中,foo 函数被调用时,没有指定 this 的值,因此 this 指向全局对象 window

硬绑定

硬绑定是一种强制绑定 this 的方法。可以使用 callapply 方法,将函数中的 this 绑定到指定的对象上。

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

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

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

在上面的例子中,foo 函数的 this 被绑定到 obj 对象上。

箭头函数的 this 绑定

箭头函数与普通函数不同,它没有自己的 this 绑定。箭头函数的 this 绑定是在函数定义时确定的,而不是在函数调用时确定的。

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

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

在上面的例子中,箭头函数中的 this 绑定到了 obj 对象,因为箭头函数是在 foo 函数中定义的。

ES9 的 this 新特性

在 ES9 中,有两个新的特性可以帮助我们更好地使用 this

Function.prototype.toString 方法的改变

在 ES9 之前,Function.prototype.toString 方法返回的字符串中,函数体内部的 this 关键字被替换成了字符串 "undefined"。但是,在 ES9 中,这个问题被修复了。

在 ES9 中,foo.toString() 的返回值中,this 关键字被替换成了字符串 "this",这使得我们更容易理解函数的行为。

Function.prototype.bind 方法的改变

在 ES9 中,Function.prototype.bind 方法被修改,使得它支持更好的默认绑定。

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

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

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

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

在上面的例子中,foo 函数被绑定到了 null,但是在调用 boundFoo 函数时,它的 this 被绑定到了 obj 对象上。

总结

this 是 JavaScript 中的一个重要概念,但是它的行为并不总是我们所期望的。ES9 中引入了一些新的特性和默认绑定,帮助我们更好地理解和使用 this。在编写 JavaScript 代码时,我们应该注意 this 的行为,并根据需要使用硬绑定、箭头函数或默认绑定来控制 this 的值。

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

纠错
反馈