call(),apply(),bind()都是用来重定义this的!
1.
var name = "小红",age=18;
var obj={
name:"小蓝",
objAge:this.age, //这里的this指向window
myMess:function(){console.log(this.name+this.age);}//这里的this指向obj
}
obj.objAge; //18
obj.myMess(); //小蓝 undefined
2.
var name="小绿";
function show(){
console.log(this.name);
}
show(); //小绿
- 三者的调用上的区别:
var name = "小红",age=18;
var obj={
name:"小蓝",
objAge:this.age,
myMess:function(){console.log(this.name+this.age);}
}
var person={
name:"小粉",
age:12
}
obj.myMess.call(person);//小粉12
obj.myMess.apply(person);//小粉12
obj.myMess.bind(person)();//小粉12
只有bind方法后面多了一个(),因为bind返回的是一个新的函数,必须调用它才可以被执行。
- 三者传递参数的区别
var name = "小红",age=18;
var obj={
name:"小蓝",
objAge:this.age,
myMess:function(a,b){console.log(this.name+this.age+"第一个参数"+a+"第二个参数"+b);}
}
var person={
name:"小粉",
age:12
}
obj.myMess.call(person,1,2); // 小粉12 第一个参数1第二个参数2
obj.myMess.apply(person,[1,2]); // 小粉12 第一个参数1第二个参数2
obj.myMess.bind(person,1,2)(); // 小粉12 第一个参数1第二个参数2
obj.myMess.bind(person,[1,2])(); //小粉12 第一个参数1,2第二个参数undefined
call、apply、bind这三个函数的第一个参数都是this的指向对象。
call:参数是直接放进去,第二个第三个以及n个都是用逗号分隔,直接放到后面。语法:Function.call(obj,[param1[,param2[,…[,paramN]]]])
apply:所有的参数必须放在一个数组里传进去。语法:Function.apply(obj,args)
call 和 apply 仅仅只是接受参数的方式不同
bind:bind()方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。