以下代码是我正在参加的在线课程作者发布的挑战的解决方案。目标是以5条消息为一组连续打印消息“ Hello World”(以及延迟时间),每组延迟增加100ms。他在中型文章中张贴了explanation for this solution(请参阅“计时器挑战#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次递归调用,以此类推。
如果有人可以逐步向我解释此过程的实际效果,我将非常感激。
答案 0 :(得分:3)
您不会得到爆炸性的指数增长,因为如果不停止旧的setInterval
就不会创建一个setInterval()
。 clearInterval(lastIntervalId)
之前总是setInterval
。
即使考虑到greeting
函数每次触发时都会调用if
,大多数调用会跳过counter
并仅增加browser.menus.onClicked.addListener((info, tab) => {
browser.search.search({
query: info.selectionText,
engine: ??
});
});
和控制台日志。这就是创建五个一组的行为的原因。
每隔5次取消旧间隔并启动一个具有新延迟的新间隔并重置计数器。在所有其他时间,计数器仅递增。