我在事件循环中读过几个帖子/ SO线程,根据MDN的文章,
当堆栈为空时,将从队列中取出一条消息并进行处理.
作为一个JS新手,我仍然感到困惑的是 - 什么时候调用堆栈变得"空"?例如,
正确的执行顺序是foo
- foo again
- bye
- bar
.
但是今天我开始思考:退出f()
电话后,技术上的堆栈是不是很空?我的意思是在那一点上我们不在任何函数内部,并且我们还没有开始任何新的执行,所以不应该处理setTimeout
调用消息(已经立即排队),然后继续执行b()
,并给出顺序foo
- foo again
- bar
- bye
?
如果我们有一百万行代码或一些密集计算要执行并且setTimeout(func, 0)
只是在队列中停留多长时间怎么办?
虽然标记中的代码块没有包含在显式函数中,但将它视为浏览器告诉javascript运行时执行的全局函数会很有帮助.因此,在脚本块中的代码执行完毕之前,调用堆栈不为空.