首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么递归/嵌套的“`setTimeout`”不停止执行而不使用“`else`”语句?

为什么递归/嵌套的“`setTimeout`”不停止执行而不使用“`else`”语句?
EN

Stack Overflow用户
提问于 2021-12-23 07:42:52
回答 1查看 121关注 0票数 0

我正在学习使用递归的setTimeout函数。

我的任务是创建一个函数,该函数接受2个number参数,fromto,并将每个数字打印到控制台,其中一个在此时延迟1秒。

我的问题是,为什么函数printNumbers1在将4号打印到控制台后不停止执行?假设timerID是不正确的,但我不明白为什么。

代码语言:javascript
运行
复制
const DELAY = 1000;

const printNumbers1 = (from, to) => {
  let counter = from;
  let timerID = setTimeout(function run() {
    console.log(counter);
    counter++;

    if (counter > to) clearTimeout(timerID);

    // the function not stop the invocation without the `else` statement
    timerID = setTimeout(run, DELAY);
  }, DELAY)
}

const printNumbers2 = (from, to) => {
  let counter = from;
  let timerID = setTimeout(function run() {
    console.log(counter);
    counter++;
    if (counter > to) clearTimeout(timerID);
    else {
      timerID = setTimeout(run, DELAY);
    }
  }, DELAY)
}

printNumbers1(1, 4); // continues to execute after 4th invocation
printNumbers2(1, 4); // stops execution after 4th invocation

EN

回答 1

Stack Overflow用户

发布于 2021-12-23 07:48:32

这是因为在第一个代码块中,执行继续进行,再次调用setTimeout,并设置timerID另一个值。

在满足counter > to条件后,您需要停止执行或阻止执行下一行(再次调用setTimeout )。这就是为什么第二个代码块是正确的。

调用clearTimeout时,它只清除先前设置的计时器,但不停止执行代码块的其余部分(包括在下一个代码行中调用另一个setTimeout )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70459067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档