Open zhenguilin opened 7 years ago
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25, 正常结果
getAge(); // NaN
如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,这是符合我们预期的。 如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window。
显示指定函数的调用者
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
要指定函数的this指向哪个对象,可以用函数本身的apply
方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数
另一个与apply()
类似的方法是call()
,唯一区别是:
比如调用Math.max(3, 5, 4)
,分别用apply()和call()实现如下:
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5
对普通函数调用,我们通常把this
绑定为null
。
修改原生方法统计调用次数
'use strict';
var count = 0;
var oldParseInt = parseInt;
window.parseInt = function(){
count ++;
return oldParseInt.apply(null, arguments);
}
parseInt('2');
parseInt('5');
parseInt('4');
alert(`一共调用了${count}次parseInt方法`);
在一个方法内部,
this
是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以,this.birth可以拿到xiaoming的birth属性