2007-04-03
Javascript对象中使用setTimeout和setInterval的问题
关键字: javascript前两天写一个js时遇到个问题。就是在js对象内部如果用setTimeout或者setInterval调用该对象的一个方法,然后在被调用方法中就无法使用this获取该对象。因为经过setTimeout调用后,this就成了浏览器了,原来那个对象就丢失了。
如:
js 代码
- function TestObj(){
- this.property = "test";
- this.called = function(){
- alert(this.property);
- }
- this.setTimeCall = function(){
- setTimeout(this.called,500);
- }
- }
- var test = new TestObj();
- test.setTimeCall();
如果直接调用test.called方法是没有问题的。但如果通过setTimeout调用,也就是调用test.setTimeCall(),this.property就为空了。因为这里的this成浏览器了。同样的问题也发生在监听浏览器的其他事件上。没办法,于是用了个比较糟糕的办法。
- function TestObj(){
- this.property = "test";
- this.called = function(){
- alert(this.property);
- }
- this.setTimeCall = function(){
- setTimeout("test.called()",500);
- }
- }
- var test = new TestObj();
- test.setTimeCall();
之所以说这样做糟糕,是因为在定义TestObj时,就必须提前知道TestObj被创建时的变量名。后来在IBM社区看到一篇探讨javascript有限状态机的文章,用了一个很巧妙的办法避免这个问题。
js 代码
- function TestObj(){
- this.property = "test";
- var self = this;
- this.called = function(){
- alert(self.property);
- }
- this.setTimeCall = function(){
- setTimeout(self.called,500);
- }
- }
- var test = new TestObj();
- test.called();
- test.setTimeCall();
在TestObj中定义一个变量,self,然后指向this。这样用self调用this,就不会发生和浏览器的this对象冲突的问题了。
虽然是很简单的一个问题,但有时候人脑子转不过弯也没办法。
评论
delphidoc
2007-08-03
还有更好的办法:
function TestObj(){
this.called = function(){
alert("OK");
}
this.setTimeCall = function(){
setTimeout(this.called.bind(this),500);
}
}
function TestObj(){
this.called = function(){
alert("OK");
}
this.setTimeCall = function(){
setTimeout(this.called.bind(this),500);
}
}
发表评论
- 浏览: 45750 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
四个有害的java习惯
不同观点: 1:一般的编辑器都把类数据和方法数据用颜色区分开,一目了然。加个a ...
-- by tom.liu -
四个有害的java习惯
to 42087743但问题在于javabean只是很少一部分java类,并且对 ...
-- by jolestar -
四个有害的java习惯
to jolestar : 你已经说了,javabean里只需要看一下几 ...
-- by 42087743 -
四个有害的java习惯
to coolnight 你说的这种情况只是javabean里的情况,而java ...
-- by jolestar -
四个有害的java习惯
很不同意第四点field声明只有一行, 把field声明放在最上面,更容易看清c ...
-- by coolnight






评论排行榜