天天看點

JavaScript是單線程嗎

在一次面試中,被問到這個問題 =》 javascript是單線程嗎

js在浏覽器中運作,是單線程的. 每個window隻有一個js線程. 既然是單線程的,那麼在某個特定的時刻,也就應該隻有特定的代碼才能夠被執行,并阻塞其他的代碼. 但是我們明明又發現,比如jquery的ajax異步調用,

而我們知道,浏覽器是事件驅動的(event driven), 浏覽器中很多行為都是異步(asynchronized)的,浏覽器會建立事件并放入執行隊列中. 也就是說,浏覽器内部有一個事件大循環,或者說消息大循環,叫做event loop(事件循環), 會輪詢事件隊列。

是以可以了解如下:

js引擎是單線程來處理它的任務隊列的。比如js單線程目前正在處理一個任務. 這個時候,發生了mouse click, a timer firing, or an xmlhttprequest completing (需要javascript去處理滑鼠點選事件,定時器觸發事件, xmlhttprequest回調觸發等)。會把這些事件放入到event loop(事件循環)中,等js目前任務執行完畢,才會去依次執行它們.

我們來看一個經典的例子

這段代碼的執行結果會 首先全部輸出first, 然後再全部輸出second

js單線程在這裡先是執行console.log('first'), 然後5毫秒後,把settimeout這個任務加入到等待隊列event loop中(注意: 不是5毫秒後馬上執行它,而是5毫秒後把它加入到等待隊列,因為現在js單線程很忙)

js單線程在忙着完成目前的事情,也就是1000000次循環輸出first.

隻能等1000000個first輸出完後才會輸出second)

繼續閱讀