开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
JS执行顺序
初学JS的时候就听过一句话:JS是单线程的,从上到下一句一句执行。
也因此没有去深究过JS的执行顺序。天真的以为就那么简单。
直到今年做一个项目的时候,我需要先拿数据再去进行一些操作,我就把后续很长的一段代码塞到了.then 里,直接堆成shi山了。
有个学长过来给我那一长串加了一个 settimeout 实现了和 then 一样的效果。 从那个时候我才知道JS执行并没有那么简单。
任务队列
JS是单线程的,所以不可能实现真正的异步操作,那么如何实现JS的伪异步操作呢?JS用了任务队列的方式。
首先JS会去主线程执行同步任务,遇到异步的任务就会扔到任务队列中。
异步任务细分又存在宏任务与微任务,宏任务放到宏任务的队列中,微任务放到微任务的任务队列中
执行顺序
- 进入主线程执行同步任务,将异步任务放到对应的任务队列中(宏任务进宏任务队列,微任务进微任务队列)
- 执行宏任务队列中的第一个任务
- 依次执行宏任务中产生的微任务
- 再次进入宏任务队列执行下一个宏任务
- 进入微任务队列执行宏任务产生的微任务
- 。。。。。
以此实现了JS的异步操作
练习
分析一下它的执行
- 执行同步任务 打印1 -> setTimeout进入宏任务队列 ->new Promise 打印6 .then进入微任务队列
- 执行微任务队列 打印 7
- 执行宏任务队列 打印2 -> setTimeout再次进入宏队列 -> new Promise 打印4 -> .then进入微任务队列
- 执行微任务队列 打印 5
- 执行宏任务队列 打印3
END