Call, Apply, Bind

Call, Apply 和 Bind 都能用来改变this的指向。它们之间的区别是:

  • call 用来明确参数个数确定的情况

  • apply 用在参数个数不明确的情况

  • bind 是传递对象

  • call和apply都会立即执行

  • bind是创建一个新的函数副本

Call 和 Apply

举例 获取数组中的最大值和最小值

var  numbers = [5, 458 , 120 , -215 ]; 
var maxInNumbers = Math.max.apply(Math, numbers),   //458
    maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458

举例 面试题 定义一个 log 方法,让它可以代理 console.log 方法

function log(){
  console.log.apply(console, arguments);
};
log(1);    //1
log(1,2);    //1 2

接下来的要求是给每一个 log 消息添加一个"(app)"的前辍

Bind

bind的定义是,bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

对比

使用举例

三个输出的都是81,但是注意看使用 bind() 方法的,他后面多了对括号。

也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。

实现

Bind

参考链接

ES5 实现

ES6 实现

Call

其中

最终的数组为:

然后

在eval中,args 自动调用 args.toString()方法,eval的效果如 jawil所说,最终的效果相当于:

call 第二种实现方式

Apply

apply 第二种实现方式

最后更新于

这有帮助吗?