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

时间:2011-12-01 13:00:07

标签: javascript jquery

jquery source功能setTimeout使用01作为第二个参数。我的印象是他们都意味着“尽快执行该功能”。

这是对的吗?两者之间有区别吗?

6 个答案:

答案 0 :(得分:29)

setTimeout的最小超时时间为4毫秒。所以两者之间实际上存在 no 差异。

  

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

Spec

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

答案 1 :(得分: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();
}

  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
    
  2. 对于Chrome,结果与Node.js

  3. 非常相似
  4. 对于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
    

答案 2 :(得分:4)

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

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");

0似乎正在做类似NodeJS的setImmediate,将指令推送到当前调用堆栈的末尾,而1调用实现所关注的最小值。< / p>

答案 3 :(得分:2)

以编程方式和计算方式存在差异,但执行它时不会产生差异,因为它只是1ms

我想如果超时设置为1ms,它会暂停该脚本并允许其他脚本同时运行。正如你所知道的那样,javascript是单线程的,所以这可能就是你的理由。

修改

感谢@molf纠正了我的想法,似乎将它设置为0ms只是让它在事件循环的下一个滴答中运行的技巧。

答案 4 :(得分:1)

由于需要setTimeout(fn,0)或setTimeout(fn,1)的原因,请查看Why is setTimeout(fn, 0) sometimes useful?

实质上,这意味着与其他浏览器任务(如页面呈现)相比,此方法的执行并不紧急。此外,js代码将在等待任务结束后运行。 实际上,使用0或1没有区别。这只是程序员的选择。理想情况下,编码员选择的数字低于4,这可能是由于Amaan指出的原因。

顺便说一下,有关Javascript计时器的基本信息,请参阅http://ejohn.org/blog/how-javascript-timers-work/

答案 5 :(得分:-1)

这只是jQuery源代码中糟糕代码实践的一个例子。

这就是全部。没有理由支持0超过1或反之亦然。

提出一个jQuery错误,将其修复/规范化以使用其中一个。