javascript是單線程語言,因此javascript是按照語句出現的順序執行的。既然javascript是單線程語言,那麼js任務也要一個一個順序執行。若是一個任務耗時過長,那麼後一個任務也必須等着。這樣不利於開發,因此須要將任務分爲兩類:一、同步任務;二、異步任務;javascript
這張圖片告訴咱們:
一、分清楚什麼是同步任務、哪一個是異步任務,同步任務和異步任務進入不一樣的場所,同步任務進入主流程棧中,異步的進入Event Table並註冊函數。
二、一旦異步任務指定的事情完成事後,其對應的回調函數移入Event Queue。
三、主線程內的任務執行完畢爲空,會去Event Queue讀取對應的函數,進入主線程執行
四、上述過程會不斷重複,也就是常說的Event Loop(事件循環)(事件循環根據判斷宏任務是否執行結束)
例子1:
let data = [];
$.ajax({java
url:www.javascript.com, data:data, success:() => { console.log('發送成功!'); }
})
console.log('代碼執行結束');
分析:
一、ajax進入Event Table,註冊回調函數success
二、ajax是異步任務,同步任務console.log('代碼執行結束')會掛到主線程上執行。
三、ajax事件完成,回調函數success進入Event Queue。
四、主線程爲空事後,主線程從Event Queue讀取回調函數success並執行ajax
這張圖告訴咱們:
一、咱們對任務有更精細的定義:
macro-task(宏任務):包括總體代碼script,setTimeout,setInterval
micro-task(微任務):Promise,process.nextTick
不一樣類型的任務會進入對應的Event Queue,好比setTimeout和setInterval會進入相同的Event Queue。
二、進入總體代碼(宏任務)(同步任務)後,開始第一次循環。接着執行全部的微任務。而後再次從宏任務開始,找到其中一個任務隊列執行完畢,再執行全部的微任務
做者:ssssyoki
連接:https://juejin.im/post/59e85e...
來源:掘金
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。異步