js的异步循环队列问题?

js中异步执行的运行机制是只有主线程空了,才会去读取"任务队列",那么什么时候才是主线程空了啊,是指当前script标签里面的代码都执行完吗,还是怎么样?

<script>
    var n = 0;
    setTimeout(function () {
        alert(++n);
    }, 0);
    for (var i = 0; i <= 1000000; i++) {
    }
</script>
<script>
    alert("a");
</script>
<script>
    alert("b");
</script>

顺序是a、1、b

阅读 2.1k
1 个回答
<script>
  var n = 0;
  setTimeout(function () {
      console.log(++n);
  }, 0);
  var begin = new Date().getTime()
  while(new Date().getTime() - begin < 2000) {
    
  }
</script>
<script>
    console.log("a");
</script>
<script>
    console.log("b");
</script>

用这个来测试。使用alert因为会发生阻塞,所以会发生想不到的事情。
然后script会有一个解析的过程。你使用alert时,后面的script还没有被解析进主线程,而setTimeout虽然是0的延迟,但是还是有个最小值的。alert阻塞了后面的解析,此时延时器时间到了,而主线程是空的(没有被解析进主线程)所以会先弹1。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题