Javascript清除定时器为什么可以乱用?

2013-08-07 10:34:09 +08:00
 coolicer
之前朋友跟我说,clearTimeout不仅可以清掉setTimeout,还可以清setInterval,clearInterval同理。都可以清的话有2个干嘛。
5011 次点击
所在节点    JavaScript
15 条回复
ahxxm
2013-08-07 10:42:42 +08:00
jjplay
2013-08-07 10:43:27 +08:00
clearTimeout 是爷

clearInterval 是 interval 的爹

setTimeout setInterval 都是clearTimeout的孙
darasion
2013-08-07 10:56:09 +08:00
一般不用setInterval
比如,发送异步请求时,如果响应很慢的话,这时用setInterval有可能堆积很多请求。
lichao
2013-08-07 11:00:37 +08:00
3 楼正解,应该优先使用 setTimeout。如果是比较耗时的任务,setInterval 会造成任务堆积。
marchtea
2013-08-07 12:34:46 +08:00
@ahxxm 很受教~
Hyperion
2013-08-07 12:38:08 +08:00
这些函数都木有在标准里出现, 所以都是各家浏览器自行实现的. 但, 可以乱用不代表推荐乱用啊... 比如html5标准里出现这个, 如果以后浏览器规定死不能互换, 你怎么办?

setInterval 就是个坑, 内存泄漏的源泉...
juicy
2013-08-07 12:48:27 +08:00
coolicer
2013-08-07 12:59:55 +08:00
@juicy 嗯,是这个意思。楼上的几个怎么就歪了
juicy
2013-08-07 13:33:00 +08:00
@coolicer 我也是看了附言才明白的。。。。。。“有2个干嘛”,要是没仔细看,这“2个”确实容易把人带向一种定势
Niris
2013-08-07 14:26:19 +08:00
setInterval 设置的回调函数,永远只有一个吧(上个函数在等待执行,就不会继续添加)。
那么 setInterval 造成任务堆积,要怎么理解?
@darasion @lichao
lichao
2013-08-07 14:47:57 +08:00
Hyperion
2013-08-07 14:51:50 +08:00
@Niris ...谁告诉你就一个的... 就算上个函数阻塞住了, 他还是会继续调用函数的...
Niris
2013-08-07 16:35:00 +08:00
The browser will not queue up more than one instance of a specific interval handler.
-- Secrets of the JavaScript Ninja

When using setInterval(), timer code is added to the queue only if there are no other instances of the timer code already in the queue.
--PROFESSIONAL JAVASCRIPT

两本书都这么说的。

可以试试下面的代码输出几个 interval

var i = window.setInterval(function() {
console.log('interval', Date.now());
}, 1000);

window.setTimeout(function() {
window.clearInterval(id);
console.log('stop', Date.now());
}, 5900);

var t = Date.now() + 5000;
while(Date.now() < t) {
console.log(1);
}
davepkxxx
2013-08-07 16:55:27 +08:00
setInterval is evil.
darasion
2013-08-07 22:00:44 +08:00
@Niris
你理解的没错,浏览器中的 javascript 的确是同步且单线程的,*除了* 真正异步的 ajax 请求。

通常回调函数把请求抛给 HttpRequest/XMLHttpRequest 的异步请求后,这个回调函数就立即 *返回* 了,而不是阻塞在那里等待请求的响应,在请求的得到响应前,很可能下一个 setInterval 超时又调用了回调函数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/78267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX