JavaScript異步的底層原理


JavaScript引擎屬於單線程作業,意味着:在同一時間只能執行一個代碼塊,這些代碼塊的執行就阻塞了異步事件的處理。

因此,出現了"任務隊列"(task queue),我們可以將任務分為兩種:一種是同步任務(synchronous),另一種是異步任務(asynchronous)。
     同步任務:
在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;
    異步任務:
不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務可以執行了,該任務才會進入主線程執行。如回調函數就是異步任務
    
具體來說,異步執行的運行機制如下。
     
 (1)所有同步任務都在主線程上執行,形成一個執行棧(execution context stack)。
      (2)主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
      (3)一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,於是結束等待狀態,進入執行棧,開始執行。
      (4)主線程不斷重復上面的第三步。
     只要主線程空了,就會去讀取"任務隊列",這就是JavaScript的運行機制。這個過程會不斷重復。

 

 

 

簡單來說,事件隊列中的任務執行的條件為:

                   1.主線程已經空閑 (同步任務已經執行完畢)
                   2.任務滿足觸發條件,如:
                       (1) 定是函數(延時時間已經達到)
                      (2)事件函數 (特定事件被觸發)
                       (3)ajax的回調函數(服務器端有數據響應)
            

下面用一個簡單的例子來解釋一下JavaScript處理任務處理的機制:

 

 

執行結果:

 

 可見,定時器的回調函數是在js代碼執行完成后,並滿足了設置的時間條件,再執行的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM