#49js 中 apply & bind & call 区别

lencxlencx2022/06/15

三者异同

+-----------------+-----------------+----------------+
|                 |   函数执行时间    |   this绑定时间  |
+-----------------+-----------------+----------------+
| function object |||
|        f        |||
+-----------------+-----------------+----------------+
| function call   |||
|      f()        |||
+-----------------+-----------------+----------------+
|    f.call()     |||
|    f.apply()    |||
+-----------------+-----------------+----------------+
|    f.bind()     |      未来        |      现在      |
+-----------------+-----------------+----------------+

相同点

  • 都是 Function 对象上的方法 ,为了改变函数体内部的 this 指向
  • 三者第一个参数都是 this 要指向的对象,即指定函数调用上下文
  • 三者都可以利用后续参数传参

不同点

  • bind 是指定上下文,返回函数,便于稍后调用,applycall 则是立即调用函数并修改上下文
    • bind() 函数会创建一个新的绑定函数 (bound function,BF)
    • 返回值:返回一个原函数的拷贝,并拥有指定的 this 值和初始参数
  • apply 传入数组
    • 返回值:调用有指定 this 值和参数的函数的结果
  • call 传入参数列表
    • call() 允许为不同的对象分配和调用属于一个对象的函数/方法
    • 可以使用 call 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)
    • 返回值:使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined

参考资料

License Copyright © 2022-present lencx