浅谈JavaScript中的apply/call/bind和this的使用

在 JavaScript 中,applycallbind 都是用于改变函数执行时 this 的指向的方法。它们在很多情况下可以替代箭头函数,同时也有自己的优缺点。

this 关键字

在 JavaScript 中,this 关键字表示当前函数执行时的执行上下文。它通常指向调用该函数的对象或者全局对象(如果没有明确定义的话)。

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

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

注意到这里的 this 指向了 myObject 对象,因为 sayHello() 方法是在 myObject 上调用的。

但是,当函数通过其他方式调用(比如直接调用、作为回调函数、通过定时器等)时,this 的指向可能会发生变化。这就需要我们手动去绑定 this

apply 和 call

applycall 可以在函数调用时显式传递一个特定的 this 给函数:

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

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

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

applycall 的作用是一样的,区别在于传入参数的方式。call 方法的第一个参数是要绑定的 this 值,后续的参数则是函数调用时的参数列表;而 apply 方法的第一个参数也是要绑定的 this 值,但是它的后续参数是以数组的形式传递的。

bind

bind 方法类似于 applycall,但是它并不会立即调用函数。相反,它返回一个新的函数,该函数会在调用时使用指定的 this 值。

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

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

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

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

在这个例子中,bind 方法返回了两个新的函数 sayHelloToPerson1sayHelloToPerson2,它们分别绑定了 person1person2 作为 this 值,并且可以在需要的时候调用。

总结

applycallbind 都是用来绑定 this 值的函数。它们可以在需要时显式地指定 this 值,从而避免 this 指向错误的对象或者全局对象。

这些方法的使用场景包括:

  • 避免回调函数中 this 的值错误。
  • 使函数复用更加方便和灵活。
  • 在特定情况下,通过修改 this 的值来实现某些功能。

但是,它们也有一些缺点,比如:

  • 可能会导致性能问题(尤其是在循环中使用)。
  • 可能会让代码难以理解和维护。
  • 绑定后的函数无法作为构造函数使用。

因此,在使用 applycallbind 时,需要谨慎考虑其适用性和影响。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/1740