如何使用window.setTimeout()在JavaScript中编写递归方法?

时间:2008-12-10 11:36:10

标签: javascript recursion

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

3 个答案:

答案 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);
/* ... */