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

关于clearTimeout清除标记的问题

我点击了多次setTimeout()之后启动了多个计时器,但是每次都赋值给了i变量,按常理来说不应该覆盖变量所指向的计时器吗?

为什么我点击多次clearTimeout()之后计数增加确实变慢了,而且最后停了,这说明确实把每一个计数器都给删除了呀。但是清除的是i变量指向的那个计数器呀。这里不太明白,为什么明明覆盖了i所指向的计数器了执行清除方法之后还能一个个的清除计数器

正在回答

1 回答

setTimeout("startCount()",1000);

这个返回的是一个计时器的id,每一个计时器在执行的时候都会有自己的ID,就是没有这个返回值,这个计时器也会运行下去,你覆盖的只是i只是这个变量,你不能做到覆盖计时器,为什么能做到清理计时器,是因为,不断有新的函数生成新的setTimeout, i的值也在变化,当你点击取消函数的时候,setTimeout会等这个取消函数执行过以后一秒才开始执行(即使这个取消函数执行时间可以忽略不计),这时候就会把下一秒将要执行的这个i给取消掉,(但是只会取消一个,因为当时的i值是唯一的)

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

勾子

这问题问的真好,我想问一下,取消的是这个i变量的同时取消咯计时器吗?有没有可能计时器在继续运行,只是我们不知道,这里跟前面的时钟事件一样,有没有可能运行多个后,虽然取消变量咯,但是仍然在运行,导致越来越卡?
2017-06-08 回复 有任何疑惑可以回复我~
#2

慕勒7123956 回复 勾子

不会取消i的,i只会新的赋值覆盖,根据i的值,来取消计时器,这个其实不是计时器,是通过函数的调用实现的每秒计时,当你运行多个以后,每次取消,都只会取消一个,但是由于i是不断在更新的,只要你点击取消,都是会取消掉一个下一秒执行的计时器的,直到程序里面的将要自信得多个settimeout都被取消
2017-06-08 回复 有任何疑惑可以回复我~
#3

勾子 回复 慕勒7123956

你这回答和上面那个一样的意思啊,这个我懂咯,我就是想知道通过i变量来取消计时器后,计时器有没有可能会在后台继续运行
2017-06-09 回复 有任何疑惑可以回复我~
#4

慕勒7123956 回复 勾子

不会啊
2017-06-09 回复 有任何疑惑可以回复我~
#5

沫荼 提问者

按照您的这个说法,i变量里面保存的到底是什么呢?为什么可以循环取到已经生成的所有计数器的ID?为什么用clear方法清除的时候填的又是i变量呢?因为按照慕课给的对于clear方法的说明,clear方法需要的参数应该是ID才对。还是说其实i变量本身不是直接存的ID,而且一种保存ID的集合,比如数组,而clear方法内部本身就封装了通过i变量来取ID的具体代码实现,所以实际上clear方法传递的参数其实是i变量而不是ID?
2017-06-09 回复 有任何疑惑可以回复我~
#6

慕勒7123956 回复 沫荼 提问者

哪里是集合了,只是你的每一个不断递归的startCount()都会对i进行赋值,每一秒中(因为代码语句的时间基本上可以忽略不计),i都会是下一秒中最后执行的那个setTimeout的ID,所以可以不断的进行清除,直到清除完,我觉得你应该去输出一下i值
2017-06-10 回复 有任何疑惑可以回复我~
#7

沫荼 提问者

谢谢,明白了
2017-06-10 回复 有任何疑惑可以回复我~
查看4条回复

举报

0/150
提交
取消
JavaScript进阶篇
  • 参与学习       468188    人
  • 解答问题       21891    个

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

进入课程

关于clearTimeout清除标记的问题

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