JavaScript,它是一种单线程语言,所有任务都在一个线程上完成,一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现"假死",也就无法响应用户的行为。
Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。
宏任务和微任务执行流程:
- 整段脚本script作为宏任务开始执行
- 遇到微任务将其推入微任务队列,宏任务推入宏任务队列
- 宏任务执行完毕,检查有没有可执行的微任务
- 发现有可执行的微任务,将所有微任务执行完毕
- 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
- 渲染完毕后,JS线程继续接管,开始新的宏任务,反复如此直到所有任务执行完毕
主要宏任务:
整段脚本script setTimeout setInterval、I/O UI交互事件 postMessage MessageChannel setImmediate(Node.js 环境)
主要微任务:promise.then catch finally process.nextTick(Node使用) MutationObserver(浏览器使用)
总结
JavaScript单线程,任务需要排队执行- 同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行
- 定时器的延迟时间为 0 并不是立刻执行,只是代表相比于其他定时器更早的被执行
- 以宏任务和微任务进一步理解 JS 执行机制
- 整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中
- 整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务
- 执行新的宏任务,凡是在执行宏任务过程中遇到微任务都将其推入微任务队列中执行
- 反复如此直到所有任务全部执行完毕
参考文章: juejin.cn/post/684490…