這幾天涉及一些前端網絡請求的問題,聽得最多的就是ajax發送請求,
回調函數
回調函數的概念我在文章中有提到,是作為另一個函數的參數被調用的函數稱之為回調函數。
之所以稱之為回調,是因為我們正常調用系統內部函數時是正調,那么反過來系統調用自定義的函數就稱之為回調。典型的像Ajax上傳文件中的success函數。
事件輪詢
事件輪詢機制字面理解的話就是對事件進行循環執行,到底什么意思呢?看一張圖:
事件輪詢(event loop)就是對事件隊列循環讀取的一種機制。
為什么需要這種機制,應該說它是一種有效地實現單線程異步的方式。
我們結合js的異步過程,來看下輪詢機制的用法:
(1) 所有同步任務都在主線程上執行,形成一個執行棧(execution context stack)。
(2) 主線程之外,還存在一個"任務隊列"(task queue)。只要ajax,onclick等異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
(3) 一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
(4) 主線程不斷重復上面的第三步。
回調與異步
回調常常與異步聯系在一起,因為是系統調用自己定義的函數,結合輪詢機制可以實現js的異步,就如上所述步驟。值得注意的是瀏覽器中很多行為是異步(Asynchronized)的,例如:鼠標點擊事件、窗口大小拖拉事件、定時器觸發事件、 XMLHttpRequest完成回調等,這并不代表js本身是異步的,而是瀏覽器的操作。
參考:
為什么javascript是單線程的卻能讓AJAX異步調用?
JS中的異步以及事件輪詢機制
什么是 Event Loop?