JavaScript - 什么时候调用堆栈变得"空"?

Yib*_*ang 17 javascript concurrency asynchronous event-loop settimeout

我在事件循环中读过几个帖子/ 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>
Run Code Online (Sandbox Code Playgroud)

正确的执行顺序是foo- foo again- bye- bar.

但是今天我开始思考:退出f()电话后,技术上的堆栈是不是很空?我的意思是在那一点上我们不在任何函数内部,并且我们还没有开始任何新的执行,所以不应该处理setTimeout调用消息(已经立即排队),然后继续执行b(),并给出顺序foo- foo again- bar- bye

如果我们有一百万行代码或一些密集计算要执行并且setTimeout(func, 0)只是在队列中停留多长时间怎么办?

RJM*_*RJM 8

虽然<script>标记中的代码块没有包含在显式函数中,但将它视为浏览器告诉javascript运行时执行的全局函数会很有帮助.因此,在脚本块中的代码执行完毕之前,调用堆栈不为空.