setTimeout(fn,0)和setTimeout(fn,1)之间的区别?

Ran*_*lue 28 javascript jquery

所述的jquery源设有的用途setTimeout与两个01作为第二个参数.我的印象是他们都意味着"尽快执行功能".

它是否正确?这两者有区别吗?

Som*_*Guy 29

setTimeout最小超时为4毫秒.所以两者之间实际上没有区别.

如果当前正在运行的任务是由setTimeout()方法创建的任务,并且timeout小于4,则将timeout增加到4.

规格

编辑:正如艾哈迈德在评论中所指出的那样,规范现在已经改变,所以答案目前是"这取决于".

  • 实际上你的假设是错误的,并且在规范中他们提到**如果嵌套级别大于5,并且超时小于4**,则将超时增加到4.所以这仅在嵌套级别大于5时才有效. (7认同)
  • 实际上 - 据我记忆 - 你定义的超时意味着最早的时刻.如果你的cpu被大量使用,你的功能可能会更晚. (3认同)

Fre*_*ind 13

我认为答案是"它取决于"现在.

我们可以在不同的平台和浏览器中运行代码:

function setTimeouts() {
  setTimeout(function() { console.log(2); }, 2);
  setTimeout(function() { console.log(1); }, 1);
  setTimeout(function() { console.log(0); }, 0);
}

for (var i = 0; i < 10; i++) {
  setTimeouts();
}
Run Code Online (Sandbox Code Playgroud)

  1. 对于Node.js,0转换为1,所以它们完全相同:https://github.com/nodejs/node/blob/master/lib/timers.js#L319,结果可能是:

    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    0
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于Chrome,结果与Node.js非常相似

  3. 对于Firefox,大多数0将在之前打印1:

    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

我不确定给出的答案是否正确。在 Chrome 中运行以下代码,0显然可以更快地调用绑定函数(只需在0和之间切换计时器值1):

console.log("A");
console.log("B");
var start = new Date().getTime();
setTimeout(function() {
    console.log(new Date().getTime() - start);
}, 0);
console.log("C");
console.log("D");
Run Code Online (Sandbox Code Playgroud)

0似乎正在做类似 Node.js 的事情setImmediate,将指令推到当前调用堆栈的末尾,同时1调用实现视为最小值的任何内容。