JavaScript学习之路07_this
2015-11-22 11:49
776 查看
this在Java中代表了父类的引用,但是在JavaScript中可谓是博大精深,这也是与JavaScript的设计之初的一些设计理念有关系,可能是为了更加灵活,也可能是一个设计缺陷,关键,我们要用,那就得知道她怎么用。这里将this应用在方法中,然后进行了解。
代码:
this真的很灵活,入了这个坑,绝对要纠结小半年,不过这也是JavaScript的魅力所在,生命不止,折腾不止。
代码:
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的魅力所在,生命不止,折腾不止。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享
- 如何创建对象以及jQuery中创建对象的方式
- IE8开发人员工具教程(二)
- 在flex中执行一个javascript方法的简单方式