Я прочитал несколько сообщений /SO потоков в цикле событий и в соответствии с статья MDN,
Когда стек пуст, сообщение выгружается из очереди и обрабатываются.
Как начинающий JS, я все еще смущен - когда именно стек вызовов становится "пустым"? Например,
<script>
function f() {
console.log("foo");
setTimeout(g, 0);
console.log("foo again");
}
function g() {
console.log("bar");
}
function b() {
console.log("bye");
}
f();
/*<---- Is the stack empty here? */
b();
</script>
Правильный порядок выполнения foo
- foo again
- bye
- bar
.
Но сегодня я начал думать: не является ли стек технически пустым сразу после выхода из вызова f()
? Я имею в виду, что в этот момент мы не находимся внутри какой-либо функции, и мы не начали никакого нового выполнения, поэтому не следует обрабатывать сообщение о вызове setTimeout
(которое было немедленно поставлено в очередь), прежде чем перейти к b()
, и задавая порядок foo
- foo again
- bar
- bye
?
Что делать, если миллион строк кода или какое-то интенсивное вычисление, которое должно быть выполнено, и setTimeout(func, 0)
просто сидит в очереди, однако долго?