牛客-事件循环机制
前言
V8引擎如何实现同步的.
JS是单线程运行的 同步任务放入调用栈(比如函数执行完即弹出栈), 异步任务(定时器、事件、ajax、promise)则挂起 推入到任务队列中,
同步任务完成之后,使用事件循环机制取出异步任务
1 事件循环
1执行JS代码的时候,当遇到同步任务时,直接推入调用栈,遇到异步任务则挂起。等异步任务有返回之后推入调用栈,待调用栈里所有同步任务完成之后,再将任务队列里的按序执行
2.同步任务完成之后弹出栈
-
接着遇到异步任务,将其挂起,推入进来并没有执行,
-
异步任务有一个挂起区域,不同的异步任务,挂起地方不一样 。如果是ajax 推入网络进程
紧着着,执行同步任务二,执行完毕之后弹出栈
-
挂起异步任务二
- 任务1,2的顺序不一定 异步任务挂起交给对应的进程去处理 这些处理的机制下面将
此时调用栈空了,此时事件循环机制 ,到任务队列中去异步任务
- 执行完毕,弹出异步任务1 压入异步任务2
2 消息队列
消息队列的任务分成
宏任务: 由浏览器发起的,直接存入消息队列中的,每一个宏任务都包含一个微任务队列。
具体事件: 1.执行script内部代码 2.定时器 3.ajax请求
微任务: 有js引擎发起的,等宏任务完成之后,再去执行当前宏任务的微任务。