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