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

来源:8-6 取消计时器clearTimeout()

慕少8119580

2017-03-05 15:24

<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是怎么找到的?

请指点一下谢谢。

写回答 关注

3回答

  • 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

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

    慕少8119...

    还是不太明白,全局变量不是只有一个 i 吗?我多次点击了之后一个 i 应该还是指向一个setTimeout()函数ID吧,它是怎么记录我之前点击传进来的setTimeout()函数ID的呢?不应该是被覆盖掉了丢失了吗?可是结果是我再多次点击停止还是能停下来,为什么?

    2017-03-05 20:46:46

    共 1 条回复 >

JavaScript进阶篇

本课程从如何插入JS代码开始,带您进入网页动态交互世界

468061 学习 · 21891 问题

查看课程

相似问题