如果您使用较小或较大的负数调用setTimeout
,则会立即运行回调,但如果使用中等负数,则回调永远不会运行。有人可以解释一下吗?
// Y and Z are printed, but not X
var x = -7677576503;
var y = -1000000000;
var z = -10000000000;
setTimeout(function () {
console.log('x');
}, x);
setTimeout(function () {
console.log('y');
}, y);
setTimeout(function () {
console.log('z');
}, z);
(在Chromium 57.0.2987.98和Firefox 50.1.0上测试)
答案 0 :(得分:12)
我想我有答案 according to MDN:
包括Internet Explorer,Chrome,Safari和Firefox在内的浏览器将延迟存储为内部的32位有符号整数。
浏览器正在将此值转换为32位signed int。 因此,当它看到你传递的值时,我们可以假设它实际上是作用于它转换为该类型的值,而the ECMAScript specification表示逐位运算的返回值必须是32位int。
运行时语义:评估 生产A:A @ B,其中@是上述产品中的一个按位运算符,评估如下:
...... [剪掉] 返回将按位运算符@应用于lnum和rnum的结果。结果是带符号的32位整数。
所以,如果我们把它放在一起并测试你给出的值:
x | 0 === 912358089
,所以超时最终会被执行..只是暂时
y | 0 === -1000000000
,并立即触发回调*。
z | 0 === -1410065408
,仍然是负面的,仍然立即被解雇*。
*所有测试都以chrome最新稳定
完成您可以使用其他负数进行测试,这些负数在转换为32位有符号整数时会产生正数
-7000000000 | 0
会导致1589934592,并且今天呼叫setTimeout(fn, -7000000000)
似乎无法触发......
编辑:感谢Vivek Athalye,我想我已确认这是发生了什么。
-4294967290000 | 0 === 6000
,如果您运行在{aprox中触发的setTimeout(_ => console.log(1), -4294967290000)
。 6秒