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

2017-03-31 19:55:57 +08:00
 good
setTimeout("alert('ok');",1580870100); 
setTimeout("alert('ok1');",15808701000);//这条会立即执行
setTimeout("alert('ok');",1580870100000);
3604 次点击
所在节点    JavaScript
12 条回复
ljcarsenal
2017-03-31 20:02:40 +08:00
lovedebug
2017-03-31 20:05:29 +08:00
定时器本来就不会按顺序执行的。
定时器只是将任务派发给异步事件管理器,什么时候执行按什么顺序执行是不确定的
HerrDu
2017-03-31 20:12:09 +08:00
第二个时间太大崩了? 崩溃了之后直接执行?
acthtml
2017-03-31 20:14:55 +08:00
超过 32bit 的最大数字了,会归一,源码就是这么写的。

// Timeout values > TIMEOUT_MAX are set to 1.
var TIMEOUT_MAX = 2147483647; // 2^31-1
myusakura
2017-03-31 20:28:54 +08:00
@acthtml 那第三条也会归一吗,为什么第三条不显示?
isayme
2017-03-31 21:31:01 +08:00
xuzicn
2017-04-01 10:36:57 +08:00
@isayme 然而 1580870100000 为啥没有立即执行,百思不得姐
isayme
2017-04-01 14:32:00 +08:00
@xuzicn @myusakura 原因应该是这样的:
// 以前是这么处理 delay 时间的
delay = delay & 2147483647

// 现在是这么处理 delay 时间的
if (delay > 2147483647) {
delay = 1
}
isayme
2017-04-01 14:40:13 +08:00
@xuzicn @myusakura 貌似说反了~~~
xuzicn
2017-04-01 15:14:18 +08:00
@isayme 这也说不通啊
isayme
2017-04-02 10:16:34 +08:00
@xuzicn Node.js 里是大于 2147483647 就强行改为 1. Chrome/Firefox 还没找到...

见: https://github.com/nodejs/node/blob/master/lib/timers.js#L390
isayme
2017-04-03 13:27:23 +08:00
@xuzicn 测试下来, 浏览器是先 delay & 0x0ffffffff 处理 delay 时间.

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

所以: setTimeout(function () {console.log('expect 1')}, Math.pow(2, 32) + 5000) 还是延迟 5 秒执行

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

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

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

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

© 2021 V2EX