1.什么是事件循环机制
Event Loop即事件循环,是解决javaScript单线程运行阻塞的一种机制。
2.为什么使用Even Loop
原因:JavaScript 是单线程的。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。
为了协调事件、用户交互、脚本、渲染、网络请求等,必须使用Event Loop。
3.Even Loop事件循环机制
执行js代码的时候,遇见同步任务,直接推入调用栈中执行遇到异步任务,将该任务挂起,等到异步任务有返回
之后推入到任务队列中,当调用栈中的所有同步任务全部执行完成,将任务队列中的任务按顺序一个一个的推入
并执行,重复执行这一系列的行为。
异步任务又分为宏任务和微任务
4.宏任务
任务队列中的任务称为宏任务,每个宏任务中都包含了一个微任务队列。
宏任务包括
执行script标签内部代码、
setTimeout/setInterval、
ajax请
postMessageMessageChannel、
setImmediate,
I/O(Node.js)
5. 微任务
等宏任务中的主要功能都完成后,渲染引擎不急着去执行下一个宏任务,而是执行当前宏任务中的微任务
微任务包括
Promise后的.then(),.catch()的内容、
MutonObserver、
Object.observe、
process.nextTick(Node.js)
例子
console.log('1');
setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})
setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})
结果
// 结果
1 - 7 - 6 - 8 - 2 - 4 - 3 - 5 - 9 - 11 - 10 - 12