jQuery源代码中使用了setTimeout
函数,它的第二个参数有时是0
,有时是1
。我认为它们的意思都是“尽快执行函数”,这是正确的吗?这两者之间有什么区别吗?
setTimeout
的最小超时时间为4ms。所以这两者没有区别。
如果当前正在运行的任务是由setTimeout()方法创建的任务,并且超时时间小于4,则将超时时间增加到4。
注:正如评论中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();
}
For Node.js, 0
is converted to 1
, so they are exactly the same: https://github.com/nodejs/node/blob/master/lib/timers.js#L319, and result might be:
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
For Chrome, the result is quite similar with Node.js
For Firefox, most of 0
will be printed before 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
则调用实现视为最小值的内容。
0
和 1
没有一致的优势。有时输出结果使用 0
更大,有时使用 1
更大。 - gfullam0
是一种常见的技巧,可以使代码在事件循环的下一个时刻运行,而不是立即运行。 - molf关于为什么需要setTimeout(fn, 0)
或setTimeout(fn, 1)
的原因,请查看为什么有时候需要使用 setTimeout(fn,0)?。
本质上,这意味着与页面渲染等其他浏览器任务相比,该方法执行的紧迫性不高。此外,JavaScript代码将在等待任务完成后运行。
实际上,在使用0或1之间没有区别。 这只是程序员的选择。 理想情况下,码农选择的数字应低于4,这可能是阿曼指出的原因。
顺便说一句,有关JavaScript定时器的基本信息,请参阅http://ejohn.org/blog/how-javascript-timers-work/。
这只是jQuery源代码中不良编程实践的一个例子。
就是这样。没有理由偏爱0
而不是1
,或者反之。
提交一个jQuery错误报告,将其修复/规范化为使用其中之一。
setTimeout
(跨浏览器),或者只是因为他们使用了1/0?前者我很想听听您的建议,后者最多只是代码异味。 - jAndy
setTimeout
时间增加到最少13毫秒。 - Randomblue