js單執行緒的原因
同步和非同步的概念
微任務和巨集任務
event loop
眾所周知,js是一門單執行緒語言,也就是一次只能幹一件事。其實主要原因是因為js的用途,js的主要作用是用來網頁互動以及操作dom,假設有兩個執行緒,乙個是新增dom元素,另乙個是刪除dom元素那麼到底該以哪個為準呢。
js作為單執行緒語言,就意味著任務必須乙個乙個執行,但是又會遇到的問題就是如果前乙個任務過大,後邊的任務就會等待直到前邊的任務執行完畢。所以有了同步任務個非同步任務的概念。同步任務是指在主線程上執行的任務,必須等到前乙個任務執行完畢後邊的任務才可以執行,而非同步任務是指不進入主線程,而是將恩任務新增到任務佇列(task queue),只有任務佇列通知主線程某個非同步任務可以開始執行了,才會執行。
而任務佇列也分為微任務和巨集任務。
微任務主要包含:promise,async,await
巨集任務主要包含:定時器,事件繫結
執行順序:微任務先執行
綜合上邊所說,js執行步驟大概為一下幾步
所有同步任務都在主線程上執行,形成乙個執行棧(execution context stack)。
主線程之外,還存在乙個"任務佇列"(task queue)。只要非同步任務有了執行結果,就在"任務佇列"之中放置乙個事件。
一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務佇列",看看裡面有哪些事件。那些對應的非同步任務,於是結束等待狀態,進入主線程開始執行。
主線程不斷地重複上邊的操作,這種執行機制稱之為event loop
如果看的懂上邊的操作來看一段**整理一下剛才的知識,
仔細想想列印的結果是什麼呢
async
function()
async
functionf2(
) console.
log(
'js開始執行');
settimeout
(function()
,0)f1
()newpromise
(function
(resolve)).
then((
)=>
) console.
log(
'js執行完成'
所以最後的列印結果為:js開始執行–>非同步函式1–>非同步函式2–>promise』–>js執行完成–>f1結束–>promise執行完成–>定時器開始執行
結語:可以多找幾道練習題理解理解思路,如果我有說的不對的地方,歡迎各位大佬指出。
JS執行機制
js是單執行緒的,settimeout和setinterval是非同步任務,要掛起,不先執行,等同步任務完成之後,再去處理非同步任務 console.log 1 settimeout function 0 console.log 3 console.log 4 輸出 1 3 4 2console.l...
JS執行機制
輸出結果為 1,2,3 js是從上到下執行的 js是單執行緒的,即在同一時間只能做一件事情 遇到同步程式,直接執行 遇到非同步程式,先掛起,等同步程式執行完畢後再執行 同步佇列 優先順序最高 非同步佇列 遇到非同步佇列先掛起,等同步佇列執行完後,再選擇執行非同步佇列的某個 settimeout中的時...
JS執行機制
js單執行緒 在同一時間js只能做一件事。為什麼是單執行緒?如果多執行緒,同時操作乙個dom會出問題。非阻塞 event loop 事件迴圈 任務佇列 同步任務佇列要優先於非同步任務佇列處理。非同步任務被分為巨集任務和微任務。常見的非同步任務分類如下 巨集任務 定時器系列,dom事件 ui互動事件 ...