當一個方法執行時內部調用另外的方法,則會造成調用棧,如圖:javascript
JavaScript有一個主線程執行當前任務,主線程的代碼同步執行,並把遇到的事件和回調註冊到事件表中。
當事件表中的事件被觸發時,將會把對應的處理函數推送到任務隊列當中。html
每一次EventLoop會從任務隊列中獲取最前面的事件處理函數進行執行。java
注意:每一次Eventloop擁有獨立的微任務隊列,在每次同步調用堆棧結束後,會檢查微任務隊列中是否有須要處理的事件,若是有就進行調用.node
當一輪事件循環結束後(Fun1),進行下一輪循環(Fun2).git
根據macrotasks隊列和microtasks隊列的執行時機不一樣,所以須要注意異步代碼的執行順序github
其原則是:web
console.log(1) setTimeout(()=>{console.log(2)},0); Promise.resolve(console.log(3)).then(()=>{console.log(4)}); var ps = new Promise((resolve,reject)=>{console.log(5);resolve(1)}); ps.then(()=>{console.log(6)}); var fs = new Promise((filename)=>{return file.read(filename)}); fs.then((rs)=>{console.log(7)}); //1,3,5,4,6,7,2
refs:
https://github.com/ccforward/cc/issues/48
https://html.spec.whatwg.org/multipage/webappapis.html#task-queueapi