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

jquery源使用setTimeout01作为第二个参数。 我的印象是他们都意味着“尽快执行function”。

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

我认为答案是“它取决于”现在。

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

 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(); } 

setTimeout的最小超时时间为4ms。 所以两者之间实际上没有区别。

如果当前正在运行的任务是由setTimeout()方法创建的任务,并且timeout小于4,则将timeout增加到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似乎正在做类似setImmediatesetImmediate ,将指令推送到当前调用堆栈的末尾,而1调用实现所关注的任何最小值。

在程序上和计算上存在差异,但执行它时不会有差异,因为它只有1ms

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

编辑:

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

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

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

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

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

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

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