淺談JS執行緒

wade3po發表於2019-01-23

執行緒,對於後端的人來講是很熟悉的,對於前端,卻基本不會注意到。我們都知道JavaScript是單執行緒的,也就是說,同一個時間只能做一件事。說是為了避免複雜性,所以JavaScript從誕生就是單執行緒,將來也不會改變。

因為是單執行緒,我們開發的時候經常是有一個方法報錯了,那麼下面的方法也不會執行,這就是單執行緒。但是瀏覽器卻又允許多執行緒執行。

雖然JavaScript是單執行緒,但是是有子執行緒存在的。

所以主執行緒下就會產生一個任務佇列,相當於分為了兩個任務,一個是同步任務,一個是非同步任務。

同步任務,前一個任務執行完畢後,執行後一個任務,形成一個執行棧。

非同步任務,也就是任務佇列會先執行,有了結果就會返回一個事件,等待主執行緒讀取。當主執行緒的同步執行完畢,就是主執行緒空了,那麼就會讀取任務佇列。任務佇列的結構是先進先出,當主執行緒讀取了一個任務佇列,那麼這個主執行緒就會繼續讀取下一個任務佇列,迴圈往復,直到執行完畢所有任務。

不同的是,JavaScript可以進行非同步操作,一般一步操作有點選事件、定時器、ajax,所以有可能在讀取任務佇列的時候要到了規定時間或者是執行完了,主執行緒才會依次執行這些對應的回撥函式。

比如

setTimeout( function(){ while(true){} } , 100);

setTimeout( function(){ alert(9) } , 100);

主執行緒讀取這個定時器的任務後一直在執行while方法,主執行緒一直死迴圈,也就沒辦法執行完畢,那麼下一個任務佇列的執行緒就無法執行到。

由於執行緒機制使用不多,還無法準確理解,只能先寫寫自己最簡單的理解。執行緒的內容還很多,有輪詢、佇列、瀏覽器的執行緒,這些都是需要一定的理解。

歡迎關注 Coding個人筆記 公眾號

相關文章