V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
coolicer
V2EX  ›  JavaScript

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

  •  
  •   coolicer · 2013-08-07 10:34:09 +08:00 · 4964 次点击
    这是一个创建于 4105 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前朋友跟我说,clearTimeout不仅可以清掉setTimeout,还可以清setInterval,clearInterval同理。都可以清的话有2个干嘛。
    第 1 条附言  ·  2013-08-07 12:26:25 +08:00
    我感觉只有2楼比较贴边,你们看清楚题没有。是clearTimeout,而不是在讨论setTimeout和setInterval
    15 条回复    1970-01-01 08:00:00 +08:00
    ahxxm
        1
    ahxxm  
       2013-08-07 10:42:42 +08:00
    jjplay
        2
    jjplay  
       2013-08-07 10:43:27 +08:00
    clearTimeout 是爷

    clearInterval 是 interval 的爹

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

    setInterval 就是个坑, 内存泄漏的源泉...
    juicy
        7
    juicy  
       2013-08-07 12:48:27 +08:00
    coolicer
        8
    coolicer  
    OP
       2013-08-07 12:59:55 +08:00
    @juicy 嗯,是这个意思。楼上的几个怎么就歪了
    juicy
        9
    juicy  
       2013-08-07 13:33:00 +08:00
    @coolicer 我也是看了附言才明白的。。。。。。“有2个干嘛”,要是没仔细看,这“2个”确实容易把人带向一种定势
    Niris
        10
    Niris  
       2013-08-07 14:26:19 +08:00
    setInterval 设置的回调函数,永远只有一个吧(上个函数在等待执行,就不会继续添加)。
    那么 setInterval 造成任务堆积,要怎么理解?
    @darasion @lichao
    Hyperion
        12
    Hyperion  
       2013-08-07 14:51:50 +08:00
    @Niris ...谁告诉你就一个的... 就算上个函数阻塞住了, 他还是会继续调用函数的...
    Niris
        13
    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
        14
    davepkxxx  
       2013-08-07 16:55:27 +08:00
    setInterval is evil.
    darasion
        15
    darasion  
       2013-08-07 22:00:44 +08:00
    @Niris
    你理解的没错,浏览器中的 javascript 的确是同步且单线程的,*除了* 真正异步的 ajax 请求。

    通常回调函数把请求抛给 HttpRequest/XMLHttpRequest 的异步请求后,这个回调函数就立即 *返回* 了,而不是阻塞在那里等待请求的响应,在请求的得到响应前,很可能下一个 setInterval 超时又调用了回调函数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:41 · PVG 05:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.