为了账号安全,请及时绑定邮箱和手机立即绑定

多次点击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是怎么找到的?

请指点一下谢谢。

正在回答

3 回答

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

0 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

慕少8119580 提问者

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

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信