区别
三者的相同点都是改变this的指向
1.call和apply的区别
call:调用一个对象的一个方法,用另一个对象替换当前对象。
第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型,当第一个参数为null、undefined的时候,默认指向window;
例如:B.call(A, args1,args2);即A对象调用B对象的方法。
apply:调用一个对象的一个方法,用另一个对象替换当前对象。
第一个参数是this要指向的对象,第二个参数是数组
例如:B.apply(A, arguments);即A对象应用B对象的方法。
//例子
var obj = {}
function f(a,b){
console.log(a,b)
console.log(this) //this是指obj
}
f.apply(obj,[1,2])
f.call(obj,1,2)
call()和bind()的区别:
相同点:都是用来改变this的指向
不同点:call()改过this的指向后,会再执行函数,bind()改过this后,不执行函数,会返回一个绑定新this的函数
function fn(){
console.log("我被调用了");
console.log(this) //指向this
}
var obj = {};
fn.call(obj) //直接调用函数
var stu = fn.bind(obj); //bind不能调用函数
stu(); //现在才可以调用函数
var name = '小张',
age =25;
var obj ={
name:'小刘',
objAge:this.age,
sayhai: function(x,y){
console.log(this.name+"年龄"+this.age,'来自'+ x +'去' + y);
}
}
var lala ={
name: "亚索",
age:18
}
obj.sayhai.call(lala,'LOL','上路') //亚索年龄18 来自LOL,去上路
obj.sayhai.apply(lala,['LOL','下路']) // 亚索年龄18 来自LOL,去下路
obj.sayhai.bind(lala,'LOL','辅助')() //亚索年龄18 来自LOL,去往辅助
obj.sayhai.bind(lala,['LOL','上路'])() //亚索年龄18 来自LOL,上路去undefined
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数有差别:
call的第一个参数是直接放进去的,后面的参数全都用逗号分隔,直接放到后面
apply的所有参数都必须放在一个数组里面传进去
bind除了返回是函数以外,它 的参数和call 一样。