SetInterval函数中的此递归调用如何工作?

时间:2018-10-17 20:51:34

标签: javascript recursion setinterval

以下代码是我正在参加的在线课程作者发布的挑战的解决方案。目标是以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次递归调用,以此类推。

如果有人可以逐步向我解释此过程的实际效果,我将非常感激。

1 个答案:

答案 0 :(得分:3)

您不会得到爆炸性的指数增长,因为如果不停止旧的setInterval就不会创建一个setInterval()clearInterval(lastIntervalId)之前总是setInterval

即使考虑到greeting函数每次触发时都会调用if,大多数调用会跳过counter并仅增加browser.menus.onClicked.addListener((info, tab) => { browser.search.search({ query: info.selectionText, engine: ?? }); }); 和控制台日志。这就是创建五个一组的行为的原因。

每隔5次取消旧间隔并启动一个具有新延迟的新间隔并重置计数器。在所有其他时间,计数器仅递增。