考虑这个简单的例子:
console.log('Start');
setTimeout(function() {
console.log('First timeout');
}, 100);
setTimeout(function () {
console.log('Second timeout');
}, 2000);
var time = Date.now();
for (var i = 0; i < 2000000000; i++) {
var temp = i * i * Math.sqrt(i);
temp = temp + temp;
}
console.log(Date.now() - time);
setTimeout(function () {
console.log('Third timeout');
}, 50);
console.log('End');
输出结果为:
Start
1219
End
First timeout
Third timeout
Second timeout
是什么让我想到生成执行队列(堆栈?)的方式。我是对的,JavaScript解释器首先检查代码,生成队列,然后开始执行,在超时时间过去时将函数从超时添加到队列末尾(因此我们有预生成的执行队列,在执行期间更新并动态生成超时列表)?
答案 0 :(得分:2)
JavaScript是单线程的。 超时调用被推送到事件循环,因此它们在所有主流调用之后执行。
Sub test()
Application.DisplayAlerts = False
ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname, FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub
注意:“第三次超时”被推送到事件循环#2而不是#1,即使它有50ms vs 100ms(第一次),因为它是在你冗长的循环之后处理的,这花费了足够的时间用于第一次超时达到。
EventLoop解释说:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop