问答详情
源自:8-6 取消计时器clearTimeout()

多次点击start开始计时为什么还能停下来?怎么解释?

<script type="text/javascript">
  var num=0;
  var i;
  function startCount(){
    document.getElementById('count').value=num;
    num=num+1;
    i=setTimeout("startCount()",1000);
  }
  function stopCount(){
    clearTimeout(i);
  }
</script>


点击一次start按钮,执行startCount()函数,变量i被赋值,但我在重复点击strat按钮重复调用startCount()函数时,变量i不应该被覆盖上了新的值了吗?但为什么我还能进行重复点击stop按钮使计数停下来?

谁能帮忙解释一下,谢谢。


补充:

详细流程是这样的:

(1)我多次点击开始按钮,开启了很多个setTimeout()函数进行递归;

(2)可以看到计数因为有多个setTimeout()运行,计数跳动的很快;

(3)我再逐个点击停止,计数函数还是能够逐个关闭。

问题是:变量 i 不应该是记录我最后一次点击开始按钮所对应的setTimeout()函数的id吗?之前的全部setTimeout()函数的id不应该是被覆盖掉了吗?为什么我还能正常的停止计数?之前被覆盖掉的id是怎么找到的?

请指点一下谢谢。

提问者:慕少8119580 2017-03-05 15:24

个回答

  • Robert_Langdon
    2017-04-05 23:55:42

    你每点击一次都会创建一个新的定时器,但是之前的定时器不会自己取消。

  • 幸福是可积的
    2017-03-21 17:39:08

    应该是有一个计数器,记录setTimeout()的次数,即是当setTimeout()被调用时,计数器的值加一,而调用setTimeout()这个函数的返回值正好就是这个计数器的值

    而clearTimeout(i);的作用是将计数器的值减一,当计数器的值减为0时,就完全清除了setTimeout()

  • 靑尹
    2017-03-05 15:56:45

    全局变量只有一个值,这边变了,那边引用的也就变了