setTimeout(fn,0)和setTimeout(fn,1)之间的区别?
jquery源使用setTimeout
, 0
和1
作为第二个参数。 我的印象是他们都意味着“尽快执行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
显然更快地调用绑定函数(只需在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");
0
似乎正在做类似setImmediate
的setImmediate
,将指令推送到当前调用堆栈的末尾,而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错误,将其修复/规范化以使用其中一个。