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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ну, первое, что нужно сказать, это то, что если вы вызываете setTimeout, но не меняете интервал, вы должны использовать setInterval.
edit (обновление из комментария): вы можете сохранить ссылку из закрытия, если используется как класс, а setInterval / clearInterval не требует повторной ссылки.
edit2: было указано, что вы написали calleееm>, который будет работать вполне корректно и на 100% однозначно.
Вне полноты это работает:
function f()
{
alert('foo');
window.setTimeout(arguments.callee,5000);
}
f();
поэтому я попробовал document.write вместо alert, и вот в чем проблема. doc.write чреват подобными проблемами из-за открытия и закрытия DOM для записи, поэтому, возможно, вам нужно было изменить innerHTML вашей цели, а не doc.write
спасибо за совет. Использование setInterval () - гораздо лучший выбор. хотя, поскольку я пишу эту программу как библиотеку, я не знаю имени объектов, созданных из моего класса. поэтому я не могу вызывать их в своем собственном классе.
Разве вы не путаете абонента с звонящим?
ха - совершенно прав я, calleе работает абсолютно нормально, поправлю
Вы можете поднести к нему указатель ...
/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */
Это не устраняет необходимость доступа к соответствующим членам экземпляра. В последующих вызовах func () this будет указывать на объект окна вместо конкретного экземпляра планировщика.
Попробуй это:-
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 - @farzad: Думаю, это тоже заслуживает вашего голоса (а не только галочку "принято"). ;-)
Это не рекурсивно, просто непрестанно