setTimeout不适用于中等负数

时间:2017-04-11 23:54:07

标签: javascript settimeout

如果您使用较小或较大的负数调用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);

JSFiddle version

(在Chromium 57.0.2987.98和Firefox 50.1.0上测试)

1 个答案:

答案 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秒