所述的jQuery源设有的用途setTimeout
与两个0
和1
作为第二个参数。我的印象是它们都意味着“尽快执行该功能”。
这个对吗?两者有区别吗?
所述的jQuery源设有的用途setTimeout
与两个0
和1
作为第二个参数。我的印象是它们都意味着“尽快执行该功能”。
这个对吗?两者有区别吗?
setTimeout
最小超时时间为 4 毫秒。所以两者实际上没有区别。
如果当前运行的任务是 setTimeout() 方法创建的任务,并且 timeout 小于 4,则将 timeout 增加到 4。
编辑:正如艾哈迈德在评论中指出的那样,规范现在已经改变,所以目前的答案是,“这取决于。”
我认为现在的答案是“视情况而定”。
我们可以在不同的平台和浏览器中运行代码:
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 只是让它在事件循环的下一个滴答声中运行的一个技巧。
出于为什么setTimeout(fn, 0)
或setTimeout(fn, 1)
需要的原因,请查看为什么 setTimeout(fn, 0) 有时有用?.
从本质上讲,这意味着与其他浏览器任务(如页面渲染)相比,该方法执行起来不是很紧迫。此外,JavaScript 代码将在等待任务结束后运行。
实际操作中,使用 0 或 1 没有区别。这只是程序员的选择。理想情况下,编码员选择的数字低于 4,这可能是由于 Amaan 指出的原因。
顺便说一句,有关 JavaScript 计时器的基本信息,请参阅http://ejohn.org/blog/how-javascript-timers-work/