JS执行机制

90 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

JS执行顺序

初学JS的时候就听过一句话:JS是单线程的,从上到下一句一句执行。 也因此没有去深究过JS的执行顺序。天真的以为就那么简单。
直到今年做一个项目的时候,我需要先拿数据再去进行一些操作,我就把后续很长的一段代码塞到了.then 里,直接堆成shi山了。
有个学长过来给我那一长串加了一个 settimeout 实现了和 then 一样的效果。 从那个时候我才知道JS执行并没有那么简单。

任务队列

JS是单线程的,所以不可能实现真正的异步操作,那么如何实现JS的伪异步操作呢?JS用了任务队列的方式。
首先JS会去主线程执行同步任务,遇到异步的任务就会扔到任务队列中。
异步任务细分又存在宏任务与微任务,宏任务放到宏任务的队列中,微任务放到微任务的任务队列中

image.png

执行顺序

  1. 进入主线程执行同步任务,将异步任务放到对应的任务队列中(宏任务进宏任务队列,微任务进微任务队列)
  2. 执行宏任务队列中的第一个任务
  3. 依次执行宏任务中产生的微任务
  4. 再次进入宏任务队列执行下一个宏任务
  5. 进入微任务队列执行宏任务产生的微任务
  6. 。。。。。

以此实现了JS的异步操作

练习

image.png 分析一下它的执行

  1. 执行同步任务 打印1 -> setTimeout进入宏任务队列 ->new Promise 打印6 .then进入微任务队列
  2. 执行微任务队列 打印 7
  3. 执行宏任务队列 打印2 -> setTimeout再次进入宏队列 -> new Promise 打印4 -> .then进入微任务队列
  4. 执行微任务队列 打印 5
  5. 执行宏任务队列 打印3

END