这与 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 中运行的
最佳答案
我已经在 firebug 控制台中尝试了您的代码,我按以下顺序得到了输出,我认为这是预期的。
在主2 f1 开始 f1完成 f2 开始 f2 完成 f3 开始 f3 完成
我在 fedora 上使用 firefox 12.0。
关于javascript - setTimeout函数和异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911330/