0

看代码

<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

我哪里错了?

任何帮助表示赞赏

4

1 回答 1

0

首先,默认情况下,JavaScript 没有 setTimeout、fetch 等 Web API 功能,浏览器中内置了这些功能。JavaScript首先将console.logs等JavaScript特性推入调用堆栈,然后检查微任务队列和宏任务队列中是否还有其他东西。

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

在这种情况下,第一个Js引擎执行console.log('first script')遇到setTimeout方法,setTimeout方法会被推送到宏任务队列,然后Js引擎转到console.log('second script')执行it.Js 引擎检查宏任务队列中是否有任何东西。由于 setTimeout 方法存在宏任务队列,它将被添加到调用堆栈 JavaScript 引擎执行它。

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

于 2021-08-11T13:57:47.903 回答