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

Это не рекурсивно, просто непрестанно

AnthonyWJones 10.12.2008 15:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
6 321
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ну, первое, что нужно сказать, это то, что если вы вызываете 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 () - гораздо лучший выбор. хотя, поскольку я пишу эту программу как библиотеку, я не знаю имени объектов, созданных из моего класса. поэтому я не могу вызывать их в своем собственном классе.

farzad 10.12.2008 14:49

Разве вы не путаете абонента с звонящим?

AnthonyWJones 10.12.2008 15:06

ха - совершенно прав я, calleе работает абсолютно нормально, поправлю

annakata 10.12.2008 16:04

Вы можете поднести к нему указатель ...

/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */

Это не устраняет необходимость доступа к соответствующим членам экземпляра. В последующих вызовах func () this будет указывать на объект окна вместо конкретного экземпляра планировщика.

AnthonyWJones 10.12.2008 15:04
Ответ принят как подходящий

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

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: Думаю, это тоже заслуживает вашего голоса (а не только галочку "принято"). ;-)

Tomalak 10.12.2008 16:13

Другие вопросы по теме