javascript - 为什么 setInterval 只接受 2^31-1 延迟值?

标签 javascript setinterval v8 spidermonkey chakra

根据specification ,

long setInterval(Function handler, optional long timeout, any... arguments);

setInterval() 应该接受long 超时延迟。

但是,在 64 位 Linux 上,它的行为就像是有符号的 32 位 int。 其他平台我没有测试过,please try并发表评论。

明显的问题是 - 为什么

有人可以解释一下为什么我会立即得到输出:

let maxSigned32 = 2147483647;
let safeInt = maxSigned32 + 1;

console.log(safeInt);
console.log(Number.MAX_SAFE_INTEGER);
console.log(safeInt < Number.MAX_SAFE_INTEGER); // true

let days = Math.round(safeInt / (1000.0 * 60 * 60 * 24));

console.log(safeInt + ' ms is ~' + days + ' days');

setTimeout(() => {
  console.log('I should not see this today')
}, safeInt);

我在 Chrome 52 和 Firefox 48 上都得到了这个(不正确?)结果。 有趣的是,当我使用最新的 ChakraCore 构建并尝试时,它的行为更加合理。

最佳答案

Web IDL 中的 long 类型不应与其同名的 C/C++ 类型进行比较。

其定义可见here :

The long type is a signed integer type that has values in the range [−2147483648, 2147483647].

关于javascript - 为什么 setInterval 只接受 2^31-1 延迟值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39174338/

相关文章:

javascript - 错误 : [$injector:modulerr]

javascript - Json.Stringify 将方法替换为数组的函数

php - 将 Javascript 变量抓取到 PHP

javascript - D3,具有 setInterval 和clearInterval 以及事件处理程序的 javascript 函数范围

javascript - "$apply already in progress"使用 Firefox 打开确认对话框时

javascript - 如何在网络中只运行一个定时器

node.js - 为什么要将 Local<Value>::New 与 String::New() 一起使用

android - 在 Android NDK 上将 GNU STL 和 C++11 与 V8 结合使用

javascript - Javascript 警报中的链接

javascript - `for(key in obj) BREAK` 的复杂度为 O(N) 而不是 O(1)。有没有办法克服这个