Следующий код - это решение проблемы, заданной автором онлайн-курса, который я принимаю. Цель состоит в том, чтобы непрерывно печатать сообщение "Hello World" (вместе с временем задержки) в группах по 5 сообщений, в которых задержка увеличивается на 100 мс для каждой группы. Он опубликовал объяснение для этого решения (см. Раздел "Таймеры" №4) в статье "Средняя", но он больше напоминает подход, чем объяснение.
Я успешно использовал рекурсию в других упражнениях и программах, но, возможно, потому, что я никогда не использовал их в контексте метода setInterval, я просто не понимаю, как он работает в этой ситуации.
(Поскольку это повторяется бесконечно, я не размещаю это как исполняемый фрагмент.)
let lastIntervalId, counter = 5;
const greeting = delay => {
if (counter === 5) {
clearInterval(lastIntervalId);
lastIntervalId = setInterval(() => {
console.log('Hello World. ' + delay);
greeting(delay + 100);
}, delay);
counter = 0;
}
counter += 1;
};
greeting(100);
Я прочитал его всю статью в Среднем виде, а также перечитал несколько статей о рекурсии, но я не могу найти ничего, что действительно применимо к этому использованию рекурсии в течение таймера JavaScript.
Мне кажется, что если сообщение журнала повторяется в группах по 5, то рекурсивный вызов greeting(delay + 100)
также будет называться 5 раз и что для каждого из этих периодов будут сделаны еще 5 рекурсивных вызовов и так что экспоненциально.
Если бы кто-то мог объяснить мне шаг за шагом, как этот процесс действительно разыгрывается, я бы очень признателен.
Вы не получаете взрывающийся экспоненциальный рост, потому что один setInterval
никогда не создается без остановки старого. setInterval()
всегда предшествует clearInterval(lastIntervalId)
.
Даже если функция setInterval
вызывает greeting
каждый раз, когда она срабатывает, большинство вызовов пропускают if
и just increment counter
и консольный журнал. Именно это создает поведение групп из пяти человек.
Каждый пятый раз старый интервал отменяется и запускается новый с новой задержкой, и счетчик сбрасывается. Все остальное время счетчик просто увеличивается.
greeting(200)
не вызывается 5 раз, и как каждый из этих вызовов не вызываетgreeting(300)
5 раз, поэтому стек заканчивается 5 приветствиями, затем 5 + 25, затем 5 + 25 + 125 и т. д.greeting(200)
вызывается пять раз, но 4 из пяти пропускают блокif
поскольку счетчик не равен пяти - они просто увеличивают счетчик и возвращаются без каких-либо дальнейших рекурсивных вызовов.