这与setTimeout如何执行其回调有关.
我有以下内容
function f1 (argument) {
console.log('f1 start');
for(var i = 0; i < 100000; ++i)
for(var j = 0; j < 10000; ++j);
console.log('f1 complete');
}
function f2 (argument) {
console.log('f2 start');
for(var i = 0; i < 1000; ++i)
for(var j = 0; j < 10000; ++j);
console.log('f2 complete');
}
function f3 (argument) {
console.log('f3 start');
for(var i = 0; i < 10000; ++i)
for(var j = 0; j < 10000; ++j);
console.log('f3 complete');
}
setTimeout(f1,0);
setTimeout(f2,0);
setTimeout(f3,0);
console.log('In main2');
输出:
In main2
f1 start
f1 complete
f3 start
f3 complete
f2 start
f2 complete
John Resig在他的article中解释,setTimeout将所有回调排队,直到当前代码块完成执行.这个StackOverflow answer解释说,即使事件被立即触发,它们实际上也是排队的.
在上面的代码中你会注意到,f1()是最长的,然后是f3()然后是f2().
我的问题是,为什么观察到的顺序(先是f1,然后是f3,最后是f2)?如果事件排队,它应该与它们被调用的顺序相同(f1,f2,f3). JavaScript引擎如何以及为什么首先选择最长的工作?
[编辑]
注意:上面的代码是在Node.js中运行的
最佳答案 无论“javascript引擎”问题(没有这样的东西,有一个
language specification和不同的实现)因为它依赖(参见这个
another answer),如果你想确保一个特定的序列顺序,你可能想要使用promises.
在https://github.com/kriskowal/q检查Q库
或者这个RSVP库https://github.com/tildeio/rsvp.js
Promises / a spec是here
可用于节点和浏览器
我自己在节点v0.10.21上的测试(与firefox和chromium的控制台相同):
~/workspace/tmp$node test.js
In main2
f1 start
f1 complete
f2 start
f2 complete
f3 start
f3 complete