1

我正在编写一个 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() 的第二种格式,并传入了对方法本身的引用。但它不起作用。

4

3 回答 3

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
}
于 2008-12-10T11:55:39.133 回答
1

首先要说的是,如果您调用 setTimeout 但不更改间隔,则应该使用 setInterval。

编辑(从评论更新):如果用作类并且 setInterval/clearInterval 不需要重新引用,则可以保留闭包的引用。

编辑2:有人指出您编写的 calle e将非常正确且 100% 明确地工作。

出于完整性,这是有效的:

function f() 
{
  alert('foo');
  window.setTimeout(arguments.callee,5000);
}

f();

所以我尝试了 document.write 而不是 alert,这似乎是问题所在。doc.write 充满了这样的问题,因为打开和关闭 DOM 进行写入,所以也许您需要更改目标的 innerHTML 而不是 doc.write

于 2008-12-10T11:42:13.890 回答
0

你可以用指针指向它...

/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */
于 2008-12-10T11:55:10.417 回答