JS分为同步任务和异步任务
同步任务在主线程执行
异步任务放在主线程之外的一个任务队列。
主线程执行完毕后,读取任务队列内容。
主线程从任务队列中读取事件,这个过程是循环不断的,称为事件循环。即event loop。
宏任务(macro)task:当前主线程上执行的就是一个宏任务。例: script 的代码、setTimeout、setInterval、postMessage等。
微任务:microtask。例:Promise.then、await后面的代码。
在执行当前宏任务时(同步执行时),遇到 setTimeout 会把它放到宏任务队列。遇到Promise.then会放到微任务队列。
当前 宏任务 执行完毕后,会先查看微任务队列,如果有任务,优先执行,否则执行下一个宏任务。所以 promise.then 会先于 setTimeout执行。、
案例1:
console.log("aaa");setTimeout(function(){console.log("bbb");},0);Promise.resolve().then(function(){console.log("ccc");})console.log("ddd");//打印结果为:aaa ddd ccc bbb

案例2:
setTimeout(function(){Promise.resolve().then(function(){console.log("bbb");})},0)Promise.resolve().then(function(){setTimeout(function(){console.log("aaa");},0)});//打印结果为:bbb aaa

