setTimeout(fn, 0)和setTimeout(fn, 1)的区别是什么?

What is the difference between setTimeout(fn, 0) and setTimeout(fn, 1)?

本文关键字:setTimeout fn 是什么 区别      更新时间:2023-09-26

jQuery源代码特性使用setTimeout, 01作为第二个参数。在我的印象中,它们都是指"尽可能快地执行该函数"。

正确吗?这两者有什么区别吗?

setTimeout的最小超时时间为4ms。因此,实际上在之间没有区别。

如果当前运行的任务是通过setTimeout()方法创建的任务,并且timeout小于4,则将timeout增加为4。

规范

EDIT:正如Ahmad在评论中指出的,规范现在已经改变了,所以目前的答案是,"这要看情况。"

我想答案是"视情况而定"。现在。

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

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. 对于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
    

我不确定给出的答案是否正确。在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似乎正在做类似Node.js的setImmediate的事情,将指令推到当前调用堆栈的末端,而1调用任何实现视为最小值。

在编程和计算上是有区别的,但在执行时您不会看到这种区别,因为它只有1毫秒。

我想,如果超时设置为1毫秒,它暂停该脚本,并允许其他脚本同时运行。你可能知道,JavaScript是单线程的,所以这可能是你在这里的原因。


感谢molf纠正我的想法。设置为ms似乎只是一个技巧,使其在事件循环的下一个tick中运行。

需要setTimeout(fn, 0)setTimeout(fn, 1)的原因,请查看为什么setTimeout(fn, 0)有时有用?.

本质上,这意味着与其他浏览器任务(如页面呈现)相比,该方法的执行不是很紧急。此外,JavaScript代码将在等待任务结束后运行。

实际上,使用0和1没有区别。这只是程序员的选择。理想情况下,编码员选择的数字低于4,这可能是由于Amaan指出的原因。

关于JavaScript定时器的基本信息,请参阅http://ejohn.org/blog/how-javascript-timers-work/

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

。没有理由更喜欢0而不是1,反之亦然。

引发jQuery bug,修复/规范使用其中一个