Javascript清除定时器为什么可以乱用? - V2EX
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 5422 次点击
    这是一个创建于 4457 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前朋友跟我说,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     Solana     367 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 05:07 PVG 13:07 LAX 22:07 JFK 01:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86