JavaScript中的微任务(microTask)和宏任务(macroTask)


一、什么是微任务,什么是宏任务:

1.微任务:Promise、async/await

2.宏任务:setTimeout、setInterval、Ajax、DOM事件

3.微任务比宏任务执行的更早

console.log(100) setTimeout(() => { console.log(200) }) Promise.resolve().then(() => { console.log(300) }) console.log(400) // 100 400 300 200
console.log("1"); setTimeout(function () { console.log("2"); new Promise(function (resolve) { console.log("4"); resolve(); }).then(function () { console.log("5"); }); }); new Promise(function (resolve) { console.log("7"); resolve(); }).then(function () { console.log("8"); }); setTimeout(function () { console.log("9"); new Promise(function (resolve) { console.log("11"); resolve(); }).then(function () { console.log("12"); }); }); // 1 // 7 // 8 // 2 // 4 // 5 // 9 // 11 // 12

 

二、event loop(事件循环)和DOM渲染的关系:

JavaScript是单线程的,而且和DOM渲染公用一个线程,所以在JavaScript执行的时候,得留一些时机供DOM渲染:

https://www.cnblogs.com/starlog/p/14742720.html

 

三、为什么微任务比宏任务执行更早:

1.因为触发时间不同

2.微任务:DOM渲染前触发,如Promise、async/await

3.宏任务:DOM渲染后触发,如setTimeout、setInterval、Ajax、DOM事件

// 修改 DOM // (alert 会阻断 js 执行,也会阻断 DOM 渲染,便于查看效果)
const $p1 = $('<p>一段文字</p>') const $p2 = $('<p>一段文字</p>') const $p3 = $('<p>一段文字</p>') $('#container') .append($p1) .append($p2) .append($p3) // // 微任务:渲染之前执行(DOM 结构已更新)
Promise.resolve().then(() => { const length = $('#container').children().length alert(`micro task ${length}`) // 3,看看DOM渲染了吗?没有
}) // 宏任务:渲染之后执行(DOM 结构已更新)
setTimeout(() => { const length = $('#container').children().length alert(`macro task ${length}`) // 3,看看DOM渲染了吗?渲染了
})

 

四、微任务和宏任务的根本区别:

 

 

1.微任务是ES6语法规定的,它不经过Web APIs

2.而宏任务是浏览器规定的,如两种定时器、Ajax、onclick等DOM事件

3.事件循环(event loop)机制分四步

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM