1.手繪一張圖說明。
2.為什麼JavaScript是單線(這裡引用阮一峰老師的話)
JavaScript的單線程,與它的用途有關。
作為瀏覽器腳本語言,JavaScript的主要用途是與使用者互動,以及操作DOM。
這決定了它只能是單線程,否則會帶來很複雜的同步問題。
例如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?
所以,為了避免複雜性,從一誕生,JavaScript就是單線程,這已經成了這門語言的核心特徵,將來也不會改變。
為了利用多核心CPU的運算能力,HTML5提出Web Worker標準,允許JavaScript腳本建立多個線程,但是子執行緒完全受主執行緒控制,且不得操作DOM。
所以,這個新標準並沒有改變JavaScript單執行緒的本質。
傳送門:JavaScript運作機制之事件循環(Event Loop)詳解
3.JavaScript的非同步體現在哪
如一開始的圖,個人認為左邊主執行緒就是同步,左邊事件佇列(訊息佇列)就是非同步。
當然JavaScript中的非同步有很多:
Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe(原理类似) setTimeout/setInterval CSS3 Transition/Animation postMessage Web Workers Web Sockets and more…