推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
good
0D

遇到一个 Js 定时器的坑,哪位大神知道是什么原因?

  •  
  •   good · Mar 31, 2017 · 4707 views
    This topic created in 3504 days ago, the information mentioned may be changed or developed.
    setTimeout("alert('ok');",1580870100); 
    setTimeout("alert('ok1');",15808701000);//这条会立即执行
    setTimeout("alert('ok');",1580870100000);
    
    12 replies  •  2017-04-03 13:27:23 +08:00
    lovedebug
    lovedebug
    Mar 31, 2017
    2
    定时器本来就不会按顺序执行的。
    定时器只是将任务派发给异步事件管理器,什么时候执行按什么顺序执行是不确定的
    HerrDu
    HerrDu
    Mar 31, 2017
    3
    第二个时间太大崩了? 崩溃了之后直接执行?
    acthtml
    acthtml
    Mar 31, 2017❤️1
    4
    超过 32bit 的最大数字了,会归一,源码就是这么写的。

    // Timeout values > TIMEOUT_MAX are set to 1.
    var TIMEOUT_MAX = 2147483647; // 2^31-1
    myusakura
    myusakura
    Mar 31, 2017
    5
    @acthtml 那第三条也会归一吗,为什么第三条不显示?
    xuzicn
    xuzicn
    Apr 1, 2017
    7
    @isayme 然而 1580870100000 为啥没有立即执行,百思不得姐
    isayme
    isayme
    Apr 1, 2017
    8
    @xuzicn @myusakura 原因应该是这样的:
    // 以前是这么处理 delay 时间的
    delay = delay & 2147483647

    // 现在是这么处理 delay 时间的
    if (delay > 2147483647) {
    delay = 1
    }
    isayme
    isayme
    Apr 1, 2017
    9
    @xuzicn @myusakura 貌似说反了~~~
    xuzicn
    xuzicn
    Apr 1, 2017
    10
    @isayme 这也说不通啊
    isayme
    isayme
    Apr 2, 2017
    11
    @xuzicn Node.js 里是大于 2147483647 就强行改为 1. Chrome/Firefox 还没找到...

    见: https://github.com/nodejs/node/blob/master/lib/timers.js#L390
    isayme
    isayme
    Apr 3, 2017❤️1
    12
    @xuzicn 测试下来, 浏览器是先 delay & 0x0ffffffff 处理 delay 时间.

    15808701000 处理后是一个负数(1371168184), 所以会被立即执行.
    1580870100000 处理后是正数 322135072, 本质上还会有延迟.

    所以: setTimeout(function () {console.log('expect 1')}, Math.pow(2, 32) + 5000) 还是延迟 5 秒执行
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4521 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 05:48 · PVG 13:48 · LAX 21:48 · JFK 00:48
    ♥ Do have faith in what you're doing.