js 宏任务顺序,两个脚本标签,第一个带有 settimout,仍然在第二个脚本之后

js macrotask order, two script tags, first with settimout, still after second script

查看代码

<script>
  console.log('first script')
  setTimeout(() => {
    console.log('settimout');
  }, 0);
</script>
<script>
  console.log('second script')
</script>

输出是

first script
second script
settimout

我的理解是 一个宏然后所有可用的微。然后是第二个宏。

所以当 js 看到第一个脚本标签时,它会将脚本添加到宏队列中, 然后将第一项(第一个脚本标签)和 运行 出队。在第一个脚本中,它会看到第一个日志,然后 运行 就可以了。

然后它看到setTimeout,它是宏,所以将它添加到宏队列。

第一个标签已完成。看看有没有微信不。然后 运行 第二个宏是 setimout。

然后 运行 第二个脚本

所以我认为输出应该是

first script
settimout
second script

我哪里错了?

感谢任何帮助

首先,默认情况下 JavaScript,没有网络 API 功能,如 setTimeout、fetch 等,浏览器中有内置功能。 JavaScript先把JavaScript像console.logs这样的特性压入调用栈,然后检查微任务队列和宏任务队列中是否还有其他东西。

宏任务默认会添加setTimeout、setInterval等方法。以同样的方式,如 fetch、promises 等方法将被添加到微任务队列中。

此时Js引擎先执行console.log('first script')遇到setTimeout方法,setTimeout方法会被push到宏任务队列然后Js引擎继续console.log('second script') 并执行 it.Js 引擎检查宏任务队列中是否有任何东西。由于 setTimeout 方法存在宏任务队列,它将被添加到调用堆栈中 JavaScript 引擎执行它。

因此,输出将是第一个脚本,第二个脚本,设置