事件循环
在这里的事件循环是指事件也就是任务在执行栈与任务队列之间来回查看是否有需要执行的任务来执行在两个地方循坏往复来执行叫做事件循环。 我们来理一下相关概念
- 1.执行栈也就是js主线程,由于js是单线层执行的所以代码都放入执行栈中运行,并原地等待结果
- 2.任务队列,这里是用来存放宿主环境中等待处理的异步代码,异步结果将在将来执行
- 3.同步代码:js可以直接放入执行栈中执行
- 4.异步代码:由于js无法直接执行异步代码,所以是需要放入宿主环境中等待预处理完放入任务队列中等待执行栈来处理
所以事件循环的全部过程就是: 在一个同时拥有同步和异步代码的程序中:同步代码直接放入执行栈,异步代码则进入宿主环境中进行等待,在时间到了之后会自动到达任务队列中去,整个事件处理开始从执行栈中的同步代码开始 ,在同步代码处理完之后开始检查任务队列中是否有待处理的异步任务,如果有放入执行栈中处理,处理完后接着看执行栈中是否有同步任务,如此循环如图:
宏任务和微任务
- 首先宏任务和微任务都是异步任务所以在两种任务都需要在同步任务之后处理
- 宏任务的异步代码(宿主环境)
- script(代码块)
- setTimeout/setinterval定时器
- settimmediate 定时器
- 微任务的异步代码(js引擎)
- process.nextTick(node)
- Promise.then catch()(注意单纯的promise本身是属于同步任务)
- Async/Await
- Object.observe等等
所以事件循环在加上宏任务和微任务之后基本的流程不变只是在执行完同步任务之后在执行异步任务之后执行异步任务时,先执行微任务后执行宏任务。
ps:个人见解,如有错误,请多指教