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的参数可以在函数执行的时候再次添加。