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歲,我叫熊貓