bind,apply,call的区别

89 阅读1分钟

相似点:

  • 都是用来改变函数的this对象的指向
  • 第一个参数都是this要指向的对象
  • 都可以利用后续参数传参

区别:

var xw = {
    name:'小王',
    gender:'男',
    age:24,
    say:function(){
        console.log(this.name+','+this.gender+",今年"+this.age);
    }
}
var xh = {
    name:'小红',
    gender:'女',
    age:18,
}
xw.say();  //小王,男,今年24

对于call:

xw.say.call(xh);

对于apply:

xw.say.apply(xh);

对于bind:

xw.say.bind(xh)();

  • call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来调用才可以。
var xw = {
    name:'小王',
    gender:'男',
    age:24.
    say:function(school,grade){
        console.log(this.name+','+this.gender+',今年'+this.age+',在'+school+'上'+grade);
    }
}
var xh = {
    name:'小红',
    gender:'女',
    age:18
}

可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。

对于call:

xw.say.call(xh,'实验小学','六年级');

对于apply:

xw.say.apply(xh,['实验小学','六年级']);

  • call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素和say方法中是一一对应的,这就是两者最大的区别。

对于bind:

  • 可以像call一样传参 xw.say.bind(xh,'实验小学','六年级')();

  • 由于返回的仍然是一个函数,所以可以再调用的时候再进行传参

xw.say.bind(xh)('实验小学','六年级')