JS 微任务和宏任务(面试题常用)

JS 微任务和宏任务(面试题常用)_第1张图片

 

概念:
1. 宏任务:当前调用栈中执行的代码成为宏任务。(主代码快,定时器等等)。
2.微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件。(promise.then,proness.nextTick等等)。 3. 宏任务中的事件放在callback queue中,由事件触发线程维护;微任务的事件放在微任务队列中,由js引擎线程维护。
js执行顺序,(先执行宏任务列再是微任务队列)
例子1:

for(var i=0;i<10;i++){
setTimeout(function(){
    console.log(i)
},0)
}


输出 10个10
‘-------------------------------------------------------------------------------’
2,加立即执行函数

分析:尽管循环执行结束,i值已经变成了3。但因遇到了自执行函数,当时的i值已经被 lockedIndex锁住了。也可以理解为 自执行函数属于for循环一部分,每次遍历i,自执行函数也会立即执行。所以尽管有延时器,但依旧会保留住立即执行时的i值。

for(var i=0;i<10;i++){
    (function(i){
   setTimeout(function(){
       console.log(i)
   },0)
})(i)
}



输出 正常 i 值序号

运行机制:
1. 在执行栈中执行一个宏任务。
2. 执行过程中遇到微任务,将微任务添加到微任务队列中。
3. 当前宏任务执行完毕,立即执行微任务队列中的任务。
4. 当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。
5. 渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。
微任务:process.nextTick、MutationObserver、Promise.then catch finally
宏任务:I/O、setTimeout、setInterval、setImmediate、requestAnimationFrame
 

你可能感兴趣的