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)