js執行機制


1,js 是單線程

      javsscript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事,這是因為 javascript 這門腳本語言誕生的使命所致-------javascript 是為處理頁面中用戶的交互,以及操作DOM而誕生的,比如我們對某個DOM 元素進行添加和刪除操作,不能同時進行,應該先進行添加,之后再刪除

      單線程就意味着,所有任務需要排隊,前一個任務結束,才會執行后一個任務,這樣所導致的問題是:如果JS執行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞的感覺。      

console.log(1);
setTimeout(function() { 
    console.log(3);
} ,1000);
console.log(2);

  代碼執行結果:1,2,3

2,同步和異步

     為了解決這個問題,利用多核CPU的計算能力,HTML5提出Web Worker 標准,允許JavaScript腳本創建多個線程,於是,js中出現了同步和異步。

    同步:前一個任務結束后再執行后一個任務,程序的執行順序與任務的排列順序是一致的、同步的。

    異步:你在做一件事情時,因為這件事情會花費很長時間,在做這件事的同時,你還可以去處理其他事情。

    它們的本質區別:這條流水線上各個流程的執行順序不同

 

    同步任務:同步任務都在主線程上執行,形成一個執行棧

     異步任務:js 的異步任務事通過回調函數實現的。一般而言,異步任務有以下三種類型:

                       ①普通事件:如 click , resize等

                       ② 資源加載:如 load , error 等

                       ③定時器:包括 setInterval , setTimeout等

                    異步任務相關回調函數添加到任務隊列中(任務隊列也稱為消息隊列)

3,①先執行執行棧中的同步任務

      ②異步任務(回調函數)放入任務隊列中

      ③一旦執行棧中的所有同步任務執行完畢,系統就會按次序讀取任務隊列中的異步任務,於是被讀取的異步任務結束等待狀態,進入執行棧,開始執行。

       ④由於主線程不斷的重復獲得任務,執行任務,再獲取任務,再執行,所以這種機制被稱為“事件循環”(event loop)。      

console.log(1);
setTimeout(function() {
   console.log(3);
 } ,0);
console.log(2);

       代碼執行結果:1,2,3

   執行棧:console.log(1)

                   setTimeout(fn,0)

   任務隊列:fn

                   console.log(2)

      


免責聲明!

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



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