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)只是在队列中停留多长时间怎么办?
虽然<script>标记中的代码块没有包含在显式函数中,但将它视为浏览器告诉javascript运行时执行的全局函数会很有帮助.因此,在脚本块中的代码执行完毕之前,调用堆栈不为空.
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |