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