【视频资源已上架哔哩哔哩,关注up主波罗丁的菠萝】node
hello你们好,本次分享一下关于JavaScript执行机制的知识点。那么废话很少说,直接上结论,首先咱们知道JavaScript是一门单线程语言,决定JavaScript执行顺序的并非代码顺序,而是event loop顺序。promise
咱们先来说解一下什么是同步任务,什么是异步任务。同步任务就是按照代码写的顺序一步一步执行下去,而异步代码呢,会先将要执行的代码放入异步队列里,而后执行同步代码,等同步代码所有执行完毕以后,再去异步队列里去查看是否有待执行的代码,若是有的话,就会执行。浏览器
用setTimeout演示一下异步
setTimeout(()=>{ console.log('timeout'); },0); console.log('11111');
咱们先不看执行结果是什么,先把这段代码的event loop顺序安排一下oop
// 首先进入总体代码 // 接着遇到了setTimout,执行它,把它对应的方法放到异步队列里去,等0ms以后再来执行它 // 接着走,遇到了console.log('11111');执行它,输出1111 // ok同步的执行完了,我去异步队列瞅瞅还有啥 // 异步队列 // 发现了console.log('timeout');,ok执行它就完了 console.log('timeout');
注意一下setTimeout第二个参数,等0ms以后再执行它,0ms以后须要看同步任务是否已经执行完毕,若是同步任务还在执行,那么只好继续等下去直到同步任务执行完毕线程
好比code
// 1000ms后执行 setTimeout(()=>{ console.log('timeout'); },1000); alert('同步阻塞');
拿着去浏览器里执行一下,会发现只要我不点按钮一直让同步任务阻塞住它就不输出timeout视频
接下来咱们再说一下Promise队列
let p = new Promise((resolve,reject)=>{ console.log('promise'); resolve(); }); p.then(()=>{ console.log('resolve'); }); console.log('同步');
咱们先不看执行结果是什么,先把这段代码的event loop顺序安排一下ip
// 首先进入总体代码 // 接着遇到了new Promise,执行它,输出console.log('promise') // 接着走,遇到了promise的then;执行它,把它对应的代码放到异步队列里 // 接着走,遇到了console.log('同步');执行它,输出同步 // ok同步的执行完了,我去异步队列瞅瞅还有啥 // 异步队列 // 发现了console.log('resolve');,ok执行它就完了,输出resolve console.log('resolve');
那么Promise和setTimeout有什么不一样呢,看着都同样啊,我们也不磨叽直接上结论,在JavaScript除了同步任务和异步任务外,也能够按照宏任务和微任务来区分。宏任务包括总体代码,setTimeout,setInterval,而微任务包括Promise,process.nextTick。process.nextTick是node环境下的咱们暂且不说它。宏任务产生的异步代码会放到下次event loop中,而微任务产生的代码会放到本次event loop的末尾处。咱们来用一段代码来演示
// 异步-宏任务 setTimeout(()=>{console.log('timeout')},0); // 同步 let p = new Promise((resolve,reject)=>{ console.log('promise'); resolve(); }); // 异步-微任务 p.then(()=>{ console.log('resolve'); }); // 同步-宏任务 console.log('同步');
那么这个输出的结果是怎样的的呢,咱们再来分析一下,此次已是第三次手把手分析代码了,明白什么意思吗?
// 首先进入总体代码 // 接着遇到了setTimout,执行它,把它对应的方法放到异步队列【宏任务】里去,等0ms以后再来执行它 // 接着遇到了new Promise,执行它,输出console.log('promise') // 接着走,遇到了promise的then;执行它,把它对应的代码放到异步队列【微任务】里 // 接着走,遇到了console.log('同步');执行它,输出同步 // ok同步的执行完了,我去异步队列瞅瞅还有啥 // 异步队列 // 【Promise微任务】本次event loop console.log('resolve'); // 【setTimeout宏任务】下一次event loop console.log('timeout')