JS是单线程的;
eventLoop就是沟通JS引擎线程和浏览器线程的桥梁,也是浏览器实现异步非阻塞模型的关键。
异步(setTimeout,ajax)DOM事件 回调,都是基于event loop
说起异步就需要了解下微任务宏任务了
属于微任务的事件包括但不限于以下几种:
- Posmise.then
- MutationObserver
- process.nextTick
属于宏任务的事件包括但不限于以下几种:
- setTimeout
- setInterval
- setImmediate
- MessageChannel
- resquestAnimationFrame
- I/O
- UI交互事件
event loop(事件循环/事件轮询)的机制(图解及执行步骤)
- 同步代码,一行一行的放在Call Stack执行
- 执行过程中遇到微任务,把他放入微任务队列中,遇到宏任务把他放入宏任务队列中。;
- 时机到了,就移动到Callback Queue(准备队列同步任务执行完后执行)
- 如Call Stack为空(即同步代码执行完)Event Loop开始工作
- 轮询查找Callback Queue,如有则移动Call Stack执行
- 然后继续轮询查找(像永动机一样)
JS是单线程运行的,异步要基于回调来实现,event loop就是异步回调的实现原理
/练习理解
setTimeout(() => console.log(1), 0);
new Promise(function (resolve, reject) {
console.log(2);
//resolve(1);
setTimeout(function(){
console.log(3);
resolve(1);
}, 0);
})
.then(() => {
console.log(4)
})
console.log(5)
setTimeout(() => console.log(6), 1000);
setTimeout(() => console.log(7), 0);
setTimeout(() => console.log(8), 1000);
输出为 2、5、1、3、4、7、6、8