在任何浏览器中运行以下代码(尝试多次):
在我看来,上面的代码将会导致控制台输出如下内容:
请解释为什么Firefox以这种方式执行操作。不知道这是否是错误或者Firefox自己的标准。 你可以在这里查看实时演示:http://jsbin.com/cijonu
console.log('processing: task #1');
setTimeout(function(){
console.log('processing: task #3');
},0);
alert('See console logs');
console.log('processing: task #2');
在我看来,上面的代码将会导致控制台输出如下内容:
"processing: task #1"
"processing: task #2"
"processing: task #3"
但在Firefox(v38.0.1)中,它会产生以下输出:
"processing: task #1"
"processing: task #3"
"processing: task #2"
请解释为什么Firefox以这种方式执行操作。不知道这是否是错误或者Firefox自己的标准。 你可以在这里查看实时演示:http://jsbin.com/cijonu
setTimeout
中的函数将在下一个执行栈上触发,而alert
可能会阻塞执行并推迟下一行代码(因此再次将这些行附加到下一个执行栈上)。 (我从不使用alert
) - Hacketoalert
暂停同步执行(技术上并不需要这样做),则还需要暂停事件循环。 - John Dvorak