一、js單線程
1.單線程的含義是js只能在一個線程上運行,也就說,js同時只能執(zhí)行一個js任務,其它的任務則會排隊等待執(zhí)行。
2.js是單線程的,并不代表js引擎線程只有一個。js引擎有多個線程,一個主線程,其它的后臺配合主線程。
3.多線程之間會共享運行資源,瀏覽器端的js會操作dom,多個線程必然會帶來同步的問題,所有js核心選擇了單線程來避免處理這個麻煩。js可以操作dom,影響渲染,所以js引擎線程和UI線程是互斥的。這也就解釋了js執(zhí)行時會阻塞頁面的渲染。
二、同步異步
JavaScript運行時,除了一個運行線程,引擎還提供一個消息隊列,里面是各種需要當前程序處理的消息。新的消息進入隊列的時候,會自動排在隊列的尾端。
1.所有同步任務都在主線程上執(zhí)行,形成一個執(zhí)行棧。
2.主線程之外,還存在一個”任務隊列”。只要異步任務有了運行結果,就在”任務隊列”之中放置一個事件。
3.一旦”執(zhí)行?!敝械乃型饺蝿請?zhí)行完畢,系統(tǒng)就會讀取”任務隊列”,看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態(tài),進入執(zhí)行棧,開始執(zhí)行。
4.主線程不斷重復上面的第三步。