Javascript setTimeout函数开始执行的次数太多

Javascript setTimeout函数开始执行的次数太多,javascript,settimeout,intervals,Javascript,Settimeout,Intervals,我用setTimeout函数创建了一个循环,在第二步或第三步调用它本身后出现问题,因为它开始执行两次。这就是我的函数的外观: var value = 70, intervalID = null; function interval() { intervalID = setTimeout(countDown, 1000); } function countDown() { value--; if(value > 0) { clearTimeout(inter

我用setTimeout函数创建了一个循环,在第二步或第三步调用它本身后出现问题,因为它开始执行两次。这就是我的函数的外观:

var value = 70, 
    intervalID = null;

function interval() {
  intervalID = setTimeout(countDown, 1000);
}

function countDown() {
  value--;
  if(value > 0) {
    clearTimeout(intervalID);
    interval();
  } else {
    endInterval();
  }
}

function endInterval() {
  // do something
}
如果我控制台变量值为69、68,然后在一个函数调用中开始两次减小变量值。我不是在任何地方调用函数countDown(),而是在一个地方调用

有什么问题吗

编辑:此代码现在可以工作。

我建议您通过停止前一个超时来“清理”超时

function interval() {
  clearTimeout(intervalID);
  intervalID = setTimeout(countDown, 1000);
}

然而,这看起来像是对症状的控制,而不是对疾病原因的控制。所以最好检测问题的原因。

对我来说很好-你确定没有调用初始函数两次吗?实际上,你没有在代码中编写一个循环,或者创建了“超时循环”?我每次调用它时都必须清除超时,它才开始工作。谢谢你的酒。超时不需要从它自己的回调函数中清除。我发现html中有两个dom元素具有相同的类,所以这就是为什么所有内容都开始执行两次。@Bergi,你是对的,但是当你为全局变量分配超时ID时,你永远不知道是否执行了分配给该变量的前一个超时。我认为它违反了完整性,因为我们可以依赖intervalID变量。OP的原始解决方案没有使用timeoutID。是的,对于这样的任务,您永远不应该使用全局变量,而应该使用封闭变量。此外,如果您希望覆盖timeoutID并希望清除以前的,则需要在覆盖它之前执行此操作。当以前的方法执行时,您的方法仅清除“最新”分配的方法。