jQuery源代码特性使用setTimeout
, 0
和1
作为第二个参数。在我的印象中,它们都是指"尽可能快地执行该函数"。
正确吗?这两者有什么区别吗?
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();
}
-
对于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
-
对于Chrome,结果与Node.js
非常相似 -
对于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
显然是更快地调用绑定函数(只需切换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
似乎正在做类似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,修复/规范使用其中一个