Как написать рекурсивный метод в JavaScript, используя window.setTimeout ()?

Я пишу класс 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 () и передал ссылку на сам метод. Но это не работает.

10.12.2008 11:36:10
Это не рекурсивно, просто продолжительно
AnthonyWJones 10.12.2008 12:03:04
3 ОТВЕТА
РЕШЕНИЕ

Попробуй это:-

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
}
9
10.12.2008 11:55:39
+1 - @farzad: Я думаю, это также заслуживает вашего положительного голоса (не только вашего «принятого» галочка). ;-)
Tomalak 10.12.2008 13:13:41

Ну, во-первых, нужно сказать, что если вы вызываете 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

1
10.12.2008 13:08:22
спасибо за совет. Использование setInterval () - гораздо лучший выбор. хотя я пишу этот список как библиотеку, я не знаю, как называются Объекты из моего класса. поэтому я не могу назвать их внутри своего класса.
farzad 10.12.2008 11:49:59
Вы не путаете звонящего с абонентом?
AnthonyWJones 10.12.2008 12:06:16
ха - совершенно верно, calle e работает абсолютно нормально,
annakata 10.12.2008 13:04:57

Вы могли бы держать указатель на это ...

/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */
0
10.12.2008 11:55:10
Это не решает необходимость доступа к соответствующим членам экземпляра. Последующие вызовы func () будут иметь «this», указывающее на объект окна вместо конкретного экземпляра планировщика
AnthonyWJones 10.12.2008 12:04:54