提起異步你們你們首先應該想到同步,首先解釋一下什麼是同步。同步即爲按照順序執行,下一任務須要等前一個任務執行完成後才能夠開始。那異步是什麼呢,簡單理解就是和同步相反,他不用等待上一個任務完成就能夠開始,像io操做,網絡請求通常會採用異步的方式進行html
js是單線程語言,JS的異步是經過回調函數實現的,即經過任務隊列,在主線程執行完當前的任務棧(全部的同步操做),主線程空閒後輪詢任務隊列,並將任務隊列中的任務(回調函數)取出來執行。"回調函數"(callback),就是那些會被主線程掛起來的代碼。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。git
雖然JS是單線程的可是瀏覽器的內核是多線程的,在瀏覽器的內核中不一樣的異步操做由不一樣的瀏覽器內核模塊調度執行,異步操做會將相關回調添加到任務隊列中。而不一樣的異步操做添加到任務隊列的時機也不一樣,如 onclick, setTimeout, ajax 處理的方式都不一樣,這些異步操做是由瀏覽器內核的 webcore 來執行的,webcore 包含上圖中的3種 webAPI,分別是 DOM Binding、network、timer模塊。github
(1)全部同步任務都在主線程上執行,造成一個執行棧(execution context stack)。
web
(2)主線程以外,還存在一個
"任務隊列"
(task queue)。只要異步任務有了運行結果,就在
"任務隊列"
之中放置一個事件。
(3)一旦
"執行棧"
中的全部同步任務執行完畢,系統就會讀取
"任務隊列"
,看看裏面有哪些事件。那些對應的異步任務,因而結束等待狀態,進入執行棧,開始執行。
(4)主線程不斷重複上面的第三步。
參考地址
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
https://www.cnblogs.com/nullcc/p/5841182.html
https://segmentfault.com/a/1190000011198232
https://github.com/wangfupeng1988/js-async-tutorial/blob/master/part1-basic/02-event-loop.md
ajax