标签:
下午用面向对象的方法写一个幻灯片插件的时候不小心写出了这样的代码:
Slider.prototype.auto=function() { setInterval(this.toRun,4000);//注意 } Slider.prototype.toRun=function() { if(this.iNow==this.aA.length - 1) ...... }
在浏览器打开的时候发现幻灯片不能如预期般自动切换,控制台给出了这样的错误提示:
this.aA isundefined?然而我已经在构造函数 Slider 中对 aA 给出了声明了,这时我意识到应该是 setInterval(this.toRun,4000) 中的 this 出现了问题,导致被调用的 toRun 方法中的 this 指针指向出现了问题。
什么问题呢?
原来 setInterval() 是定义于 window 对象下的一个方法,所以 this 指向的不是 Slider 的实例对象而是 window 对象。
发现了问题所在之后,我改了一下代码,能正常运行了。
改写之后的代码:
Slider.prototype.auto=function() { var _this=this; //setInterval(this.toRun,4000);//有问题,this指针重新绑定,指向window对象 setInterval(function(){ _this.toRun(); },5000)//通过闭包得到当前作用域 }
解决方法是事先把指向 Slider 实例对象的 this 指针存储于 _this 变量中,这时通过 _this.toRun(),调用原形方法。(注意:通过闭包获得所在函数属性的调用权限)
关于this的使用
javascript面向对象编程中,绝对无法绕开的三大核心概念:一个是闭包,一个是原型链,另一个便是 this 。君不见,javascript源码中各种铺天盖地的 this...
网上有许多文章对this的概念也都做了很透彻的解释,但我感觉得这些文章有把简单的问题复杂化之嫌,因为关于this的概念其实只需要记住一句话就够了。
“this所在的函数属于哪个对象,this便指向谁。”
理解了这句话,你便掌握了this!
标签:
原文地址:http://www.cnblogs.com/tianheila/p/4851684.html