我正在编写一个JavaSCript类,它有一个递归调用自身的方法。
Scheduler.prototype.updateTimer = function () {
document.write( this._currentTime );
this._currentTime -= 1000;
// recursively calls itself
this._updateUITimerHandler = window.setTimeout( arguments.callee , 1000 );
}
物业描述:
_currentTime: the currentTime of the timer in miliseconds.
_updateUITimerHandler: stores the reference so can be used later with clearTimeout().
我的问题是我在使用setTimeout()的递归。我知道setTimeout()将接受一些要执行的字符串,或者对函数的引用。因为这个函数是一个对象的方法,所以我不知道如何从外面调用它。所以我使用了setTimeout()的第二种格式,并传入了对方法本身的引用。但它不起作用。
答案 0 :(得分:9)
试试这个: -
Scheduler.prototype.startTimer = function() {
var self = this;
function updateTimer() {
this._currentTime -= 1000;
self.hTimer = window.setTimeout(updateTimer, 1000)
self.tick()
}
this.hTimer = window.setTimeout(updateTimer, 1000)
}
Scheduler.prototype.stopTimer = function() {
if (this.hTimer != null) window.clearTimeout(this.hTimer)
this.hTimer = null;
}
Scheduler.prototype.tick = function() {
//Do stuff on timer update
}
答案 1 :(得分:1)
首先要说的是,如果你正在调用setTimeout而不是更改间隔,那么你应该使用setInterval。
编辑(从注释更新):如果用作类,则可以保留闭包的引用,并且setInterval / clearInterval不需要重新引用。
edit2:有人指出你写了calle e ,它可以正常工作,100%明确地工作。
完整性,这有效:
function f()
{
alert('foo');
window.setTimeout(arguments.callee,5000);
}
f();
所以我尝试了document.write而不是alert,这似乎是问题所在。 doc.write充满了这样的问题,因为打开和关闭DOM进行编写,所以你需要的是改变你的目标的innerHTML而不是doc.write
答案 2 :(得分:0)
你可以指着它......
/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */