JavaScript是一个单线程的脚本语言。
Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时可能阻塞的一种机制。
浏览器中的 Event Loop
- 函数入执行栈,当Stack中执行到异步任务的时候,就将他丢给
WebAPIs,接着执行同步任务,直到Stack为空; - 此期间
WebAPIs完成这个事件,把回调函数放入任务队列中等待执行(微任务放到微任务队列,宏任务放到宏任务队列) - 执行栈为空时,
Event Loop把微任务队列执行清空; - 微任务队列清空后,进入宏任务队列,取队列的第一项任务放入
Stack(栈)中执行,回到第1步。
node.js中的 Event Loop
Node.js 将各种任务分成至少 6 类,按先后顺序调用,因此将时间分为六个阶段:
timers阶段(setTimeout)I/O callbacksidle, preparepoll轮询阶段,停留时间最长,可以随时离开。- 主要用来处理 I/O 事件,该阶段中
Node会不停询问操作系统有没有文件数据、网络数据等 - 如果
Node发现有 timer 快到时间了或者有setImmediate任务,就会主动离开 poll 阶段
- 主要用来处理 I/O 事件,该阶段中
check阶段,主要处理setImmediate任务close callback
微任务和宏任务
在JavaScript中,任务被分为两种,一种宏任务(MacroTask)也叫Task,一种叫微任务(MicroTask)。
MacroTask(宏任务): script全部代码、setTimeout、setInterval、setImmediate(浏览器暂时不支持,只有IE10支持)
MicroTask(微任务): Process.nextTick(Node独有)、Promise、Object.observe(废弃)、MutationObserver