我正在学习使用递归的setTimeout函数。
我的任务是创建一个函数,该函数接受2个number参数,from和to,并将每个数字打印到控制台,其中一个在此时延迟1秒。
我的问题是,为什么函数printNumbers1在将4号打印到控制台后不停止执行?假设timerID是不正确的,但我不明白为什么。
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
发布于 2021-12-23 07:48:32
这是因为在第一个代码块中,执行继续进行,再次调用setTimeout,并设置timerID另一个值。
在满足counter > to条件后,您需要停止执行或阻止执行下一行(再次调用setTimeout )。这就是为什么第二个代码块是正确的。
调用clearTimeout时,它只清除先前设置的计时器,但不停止执行代码块的其余部分(包括在下一个代码行中调用另一个setTimeout )。
https://stackoverflow.com/questions/70459067
复制相似问题