楼主怒了!setTimeout调用类成员函数,气死人啊!
折腾了一个下午。就是想把一堆比较乱的code封到一个类里。其中有个成员函数需要用setTimeout 每隔1秒调用一次。
但是写了几次都不行。 请问为什么
function ClassA(){
this.i = 0;
}
ClassA.prototype.run = function(){
this.i++;
document.getElementById('txt').value=this.i;
var obj = this;
setTimeout(function(){obj.run();},1000); //只有这样写能成功!请问为什么以下几种不行啊?
//setTimeout(obj.run,1000); //这样第二次调用的i值就变成了NaN
//setTimeout(function(){this.run();},1000); //Object [object global] has no method 'run'
//setTimeout(this.run,1000); //直接this更不行了
}
// 入口函数,调用 ClassA.run()
function start(){
var test = new ClassA();
test.run();
}
如上所示,请问为什么一定要用obj 代替this,并且用function包起来啊? 感觉完全不懂JS 。。。
------解决方案--------------------Javascript对象中关于setTimeout和setInterval的this介绍
是setTimeout里面作用域的问题
------解决方案--------------------function start(){
var test = new ClassA();
test.run();
}
你把对象做成局部变量怎么行?
------解决方案--------------------function start(){
test = new ClassA();
test.run();
}
------解决方案--------------------这this 可厉害,习惯习惯,
------解决方案--------------------[code=javascript]
setTimeout(function(){obj.run();},1000); //只有这样写能成功!请问为什么以下几种不行啊?
//setTimeout(obj.run,1000); //这样第二次调用的i值就变成了NaN
//setTimeout(function(){this.run();},1000); //Object [object global] has no method 'run'
//setTimeout(this.run,1000); //直接this更不行了
[/code
首先要知道:setTimeout(func,time)和setInterval(func,time)中,参数func为函数 且该函数中的this只会指向window。
然后我们再看一下上面四种方式:
第一种成功 应该没啥疑问。
第二种,函数参数为obj.run 即:
function(){
this.i++;
document.getElementById('txt').value=this.i;
var obj .......
.......
}
因为this是指向window的,window.i又不存在,所以会出错。
第三种也是,因为this指向window,而全局对象中并没有run这个方法,所以会报错。
第四种中的this.run和obj.run是一样的,所以等价于第二种情况。
------解决方案--------------------