call、apply、bind的用法分别是什么?

call(),apply(),bind()都是用来重定义this这个对象的。

var name = '佩奇',age = 6;
var obj = {
    name = '浩克',
    objAge: this.age,
    myLove:function(){
        console.log( this.name +"年龄"+ this.age);
    }
}
var mw= {
    name : '灭霸',
    age: 88
}
obj.myLove.call(mw); //灭霸年龄88
obj.myLove.apply(mw); //灭霸年龄88
obj.myLove.bind(mw)(); // 灭霸年龄88

以上除了bind方法后面多了一个()外,结果返回都一致。
由此得出结论,bind返回的是一个新的函数,你必须调用它才会被执行。

对比call、apply、bind传参的情况
var name = '佩奇',age = 6;
var obj = {
    name = '浩克',
    objAge: this.age,
    myLove:function(){
        console.log( this.name +"年龄"+ this.age,"来自" + fm + "去往" + t );
    }
}
var mw= {
    name : '灭霸',
    age: 88
}
obj.myLove.call(mw,'成都','上海'); //灭霸年龄88来自成都去往上海
obj.myLove.apply(mw,['成都','上海']); //灭霸年龄88来自成都去往上海
obj.myLove.bind(mw,'成都','上海')(); // 灭霸 年龄88 来自成都去往上海
obj.myLove.bind(mw,['成都','上海'])(); // 灭霸 年龄88 来自成都上海去往undefined

从上面的四个结果不难看出
call,bind,apply这三个函数的第一个参数都是this的指向对象,直到第二个参数差别就出来了。
call的参数是直接放进去的,直接用逗号分离;
apply的所有参数都必须放在一个数组里面传进去;
bind除了返回是函数以外,它的参数和call的放入方式一样。
它们三者的参数不限定是string类型,允许是各种类型,包括函数、对象等等。


总结

call,apply,bind都是可以改变函数体内this的指向。
call,apply,bind使用时,传入的第一个参数都是用来传递this的指向的,也就是对上下文的指定。
call,apply,bind都是可以传入多个参数,不同的是,call和bind的后续参数都是按照顺序传参,而apply的传参类型是数组;bind的参数可以在函数执行的时候再次添加。

你可能感兴趣的:(call、apply、bind的用法分别是什么?)