jquery source功能setTimeout
使用0
和1
作为第二个参数。我的印象是他们都意味着“尽快执行该功能”。
这是对的吗?两者之间有区别吗?
答案 0 :(得分:29)
setTimeout
的最小超时时间为4毫秒。所以两者之间实际上存在 no 差异。
如果当前正在运行的任务是由setTimeout()方法创建的任务,并且超时小于4,则将超时增加到4。
编辑: 正如艾哈迈德在评论中指出的那样,规范现在已经改变了,所以目前答案是“这取决于。”
答案 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();
}
对于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
答案 2 :(得分: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
似乎正在做类似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错误,将其修复/规范化以使用其中一个。