setInterval 和setTimeout 重新赋值clear的问题(上)
2014-01-07 11:41
351 查看
我习惯把问题用标题写出来,简洁明了,
js新手入门3月不到,问题自然一大堆,碰到这个问题是因为自己尝试做一个小插件,问题我简化一下:
第二次执行被注释上了,此时body的click事件能clear掉timer,但是如果去掉第二次执行的注释,你认为click还能clear掉timer吗??
注,我的timer已经是全局变量了,所以这里不关timer全局,local的事情。
因为我自己的插件中setInterval的时间间隔非常短,加上t1触发不明显,我不知道触发了几次,所以当时clear不掉的原因找了半天。但这段代码一看调试台就清楚,当执行两次t1的时候,每秒log两次abc-----事实上我们开启了两个定时器。
更明显的是,你可以在最后添加一行 console.log(timer), 并且分别在执行一次和执行两次的情况下观察,你会发现执行一次console.log(timer)的值为1,而两次console的值为2。我开始以为timer的值代表开启的定时器个数,但事实上用timer的ID形容这个数字更为准确,id为1的timer,id为2的timer。
现在再去解释为什么不能clear掉的原因似乎容易明白了,t1()执行第一次,给我们的timer赋值,指向一个内部ID为1的定时器,第二次t1执行,timer重新赋值了,timer指向了ID为2的定时器。此时你去clearTimeout,clear的只是id为2的那个定时器了,而第一个定时器我们已经失去对它的引用了,无法关闭了,同样的情况也可以发生在setTimeout上。
(注:定时器的ID是在什么范围是唯一的,作为学材料的工科妹子,我不太清楚这个线程的原理,这两天心力交瘁,也没有去测试过)。
关于解决的办法,晚一点我会查一下牛人,貌似也没有很好的方法。我之前用过一个array来保存timer,通过push方法,和pop方法,可以保证每个定时器引用,和clear。功能是达到了,但是非常不漂亮+恶心。
欢迎留言~
js新手入门3月不到,问题自然一大堆,碰到这个问题是因为自己尝试做一个小插件,问题我简化一下:
var timer; function t1(){ timer = setInterval(function(){ console.log("abc"); },1000) } t1(); //执行一次 //t1(); //再执行一次 $(document).click(function(){ clearTimeout(timer); })
第二次执行被注释上了,此时body的click事件能clear掉timer,但是如果去掉第二次执行的注释,你认为click还能clear掉timer吗??
注,我的timer已经是全局变量了,所以这里不关timer全局,local的事情。
因为我自己的插件中setInterval的时间间隔非常短,加上t1触发不明显,我不知道触发了几次,所以当时clear不掉的原因找了半天。但这段代码一看调试台就清楚,当执行两次t1的时候,每秒log两次abc-----事实上我们开启了两个定时器。
更明显的是,你可以在最后添加一行 console.log(timer), 并且分别在执行一次和执行两次的情况下观察,你会发现执行一次console.log(timer)的值为1,而两次console的值为2。我开始以为timer的值代表开启的定时器个数,但事实上用timer的ID形容这个数字更为准确,id为1的timer,id为2的timer。
现在再去解释为什么不能clear掉的原因似乎容易明白了,t1()执行第一次,给我们的timer赋值,指向一个内部ID为1的定时器,第二次t1执行,timer重新赋值了,timer指向了ID为2的定时器。此时你去clearTimeout,clear的只是id为2的那个定时器了,而第一个定时器我们已经失去对它的引用了,无法关闭了,同样的情况也可以发生在setTimeout上。
(注:定时器的ID是在什么范围是唯一的,作为学材料的工科妹子,我不太清楚这个线程的原理,这两天心力交瘁,也没有去测试过)。
关于解决的办法,晚一点我会查一下牛人,貌似也没有很好的方法。我之前用过一个array来保存timer,通过push方法,和pop方法,可以保证每个定时器引用,和clear。功能是达到了,但是非常不漂亮+恶心。
欢迎留言~
相关文章推荐
- setInterval 和setTimeout 重新赋值clear的问题(下)
- setInterval,setTimeout与jquery混用的问题
- setInterval,setTimeout与jquery混用的问题
- setinterval 和 setTimeout调用方式以及浏览器缓存问题
- Canvas绘制雨滴之setInterval与setTimeout(一)
- setInterval & setTimeout
- Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
- window.setInterval做定时器和使用window.clearInterval()停止定时器
- setInterval 、 settimeout 、clearInterval 用法(特殊情况下代替schedule)
- 关于select函数中timeval和fd_set重新设置的问题
- setTimeout,setInterval你不知道的…
- Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数
- setInterval 和 setTimeout
- 关于select函数中timeval和fd_set重新设置的问题
- window关闭,开启,//获取时间,时间停止,settimeout,setinterval //dom获取html值,改变html值
- JS下setTimeout与setInterval二者的差异
- 【重新上本科】在实际问题中,内存赋值所拖累的效率(java版本)
- android ImageView 赋值问题setImageResource和setImageBitmap
- setInterval,setTimeout的用法