this对象指向会经常改变的,这会造成一些意想不到的影响。JavaScript提供了call
、apply
、bind
这三个方法,来切换/固定this
的指向。
首先说说他们三个之间的区别~
相同点:
1、apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
2、apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
3、apply 、 call 、bind 三者都可以利用后续参数传参;
不同点:
1、bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
2、call与apply接受参数的方式不太一样
搞起来搞起来,代码走一波:
var Dog=function(){};
Dog.prototype={
name:'PiTe',
age:1,
say:function(name,age){
alert(this.name+"的年龄是"+this.age)
},
myName:function(name,age){
alert("我今年"+age+"岁,我叫"+name)
}
}
var cat={
name:'咪咪',
age:'3'
}
let dog=new Dog('PiTe',1);
dog.say();//PiTe的年龄是1
//bind后面加()让其执行
dog.say.call(cat)//咪咪的年龄是3
dog.say.apply(cat)//咪咪的年龄是3
dog.say.bind(cat)()//咪咪的年龄是3
/*---参数[注意apply是数组]---*/
var other={}
dog.myName.call(other,'老虎',5)//我今年5岁,我叫老虎
dog.myName.apply(other,['兔子',4])//我今年4岁,我叫兔子
dog.myName.bind(other)('熊猫',6)//我今年6岁,我叫熊猫