1、 A().then.(res()=>{
res.data;
})
functiongetAge(){
vary=newDate().getFullYear();
returny-this.birth;
}
varxiaoming={
namee:'xm',
birth:1990,
age:getAge
};
xiaoming.age();
getAge();
如果以對象的方法形式調用,比如xiaoming.age(),該函數的this指向被調用的對象,
也就是xiaoming,這是符合我們預期的。
如果單獨調用函數,比如getAge(),此時,該函數的this指向全局對象,也就是window。
如果這麼寫:
varfn=xiaoming.age;//先拿到xiaoming的age函數
fn();//NaN
也是不行的!要保證this指向正確,必須用obj.xxx()的形式調用!
下面使用嚴格模式:
'usestrict';
varxiaoming={
name:'小明',
birth:1990,
age:function(){
varthat=this;//在方法內部一開始就捕獲this
functiongetAgeFromBirth(){
vary=newDate().getFullYear();
returny-that.birth;//用that而不是this
}
return getAgeFromBirth();
}
};
xiaoming.age();//25
2、applay方法
用var that=this;,你就可以放心地在方法內部定義其他函數,而不是把所有語句都堆到一個方法中。
要指定函數的this指向哪個對象,可以用函數本身的apply方法,它接收兩個參數,第一個參數就是需要綁定的this變量,第二個參數是Array,表示函數本身的參數。
用apply修復getAge()調用:
functiongetAge(){
vary=newDate().getFullYear();
returny-this.birth;
}
varxiaoming={
name:'小明',
birth:1990,
age:getAge
};
xiaoming.age();//25
getAge.apply(xiaoming,[]);//25,this指向xiaoming,參數爲空
3、call()方法
另一個與apply()類似的方法是call(),唯一區別是:
apply()把參數打包成Array再傳入;
call()把參數按順序傳入。
比如調用Math.max(3,5,4),分別用apply()和call()實現如下:
Math.max.apply(null,[3,5,4]);//5
Math.max.call(null,3,5,4);//5
4、使用applay方法,重新指向函數,動態達到裝飾器的作用
利用apply(),我們還可以動態改變函數的行爲。
JavaScript的所有對象都是動態的,即使內置的函數,我們也可以重新指向新的函數。
現在假定我們想統計一下代碼一共調用了多少次parseInt(),可以把所有的調用都找出來,然後手動加上count+=1,不過這樣做太傻了。最佳方案是用我們自己的函數替換掉默認的parseInt():
'usestrict';
var count=0;
var oldParseInt=parseInt;//保存原函數
window.parseInt=function(){
count+=1;
return oldParseInt.apply(null,arguments);//調用原函數
};
//測試:
parseInt('10');
parseInt('20');
parseInt('30');
console.log('count='+count);//3