这与如何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');
输出:
在 main2
f1 开始
f1 完成
f3 开始
f3 完成
f2 开始
f2 完成
John Resig 在他的文章中解释说,将setTimeout
所有回调排队,直到当前代码块完成其执行。这个 StackOverflow答案解释了即使看起来好像事件是立即触发的,但它们实际上是排队的。
在上面的代码中,您会注意到,f1()
是最长的,其次是 f 3()
,然后是f2()
。
我的问题是,为什么观察到的顺序(f1
首先,然后f3
,最后f2
)?如果事件被排队,它应该与它们被调用的顺序相同(f1
, f2
, f3
)。JavaScript 引擎如何以及为什么首先选择最长的工作?
[编辑] 注意:上面的代码是在 Node.js 中运行的