JavaScript学习之路07_this

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的魅力所在,生命不止,折腾不止。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值