您的位置:首页 > Web前端 > JavaScript

JavaScript学习之路07_this

2015-11-22 11:49 776 查看
this在Java中代表了父类的引用,但是在JavaScript中可谓是博大精深,这也是与JavaScript的设计之初的一些设计理念有关系,可能是为了更加灵活,也可能是一个设计缺陷,关键,我们要用,那就得知道她怎么用。这里将this应用在方法中,然后进行了解。

代码:

var xiaoming = {
name:'xiaoming',
birth:1994,
age:function(){
var y = new Date().getFullYear();
return y-this.birth; //这里的this是什么
}
};
//调用xiaoming的age属性
xiaoming.age();
21
//this是什么?
在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。
将上面的对象拆开,是这样的。
function getAge(){
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name:'xiaoming',
birth:1994,
age:getAge
}
xiaoming.age(); //21
getAge(); //NaN
为什么呢?因为在xiaoming.age()中,被调用者是xiaoming,this就指向了这个对象,也就是xiaoming,但是getAge指向的是全局变量,也就是window,后来改变了一下规则,指向的是undefined.
但是这样也并没有大幅度的改善this的使用,只是将问题提前暴漏出来,避免了出现问题的时候再回头查找的尴尬。
当然,解决办法也是有的,就是在使用this之前将其捕获。
var xiaoming = {
name:'xiaoming',
birth:1994,
age:function(){
//这这里及早捕获,
var that = this;
function getBirth(){
var y = new Date().getFullYear();
//这里使用的是that而不是this
return y-that.birth;
}
return getBirth();
}
};
xiaoming.age();
21
//Apply函数
function getAge(){
var y = new Date().getFullYear();
return y-this.birth;
}
var xiaoming = {
name:'xiaoming',
birth:1994,
age:getAge
}
//调用age属性
xiaoming.age();
21
//使用apply方法,也可以,为什么呢?
它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
getAge.apply(xiaoming, []);
21
**案例**
需求:统计一下代码一共调用了多少次parseInt()
思路:使用自己定义的函数替换掉parseInt方法即可
var count=0;
var oldParseInt = parseInt;
window.parseInt = function(){
++count;
return oldParseInt.apply(null, arguments);
}
parseInt('10');
parseInt('20');
count;
2
parseInt('30');
30
count;
3
ok了。
最后就是和apply类似的一个方法call,
区别:
apply()把参数打包成Array再传入;
call()把参数按顺序传入
Math.max.apply(null, [2,5,3]);
5
Math.max.call(null, 2,5,3);
5


this真的很灵活,入了这个坑,绝对要纠结小半年,不过这也是JavaScript的魅力所在,生命不止,折腾不止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript this