event loop這東西,確實把我坑了一把,面試的時候被問到這個問題的時候,我是懵逼的,完全不知道怎麼回答,而當我回來查到原來這個聽起來如此玄乎又厲害的名字就是非同步和單線程那塊的知識的時候,我心情又變得很複雜,怪我,不知道它有這麼個高級的名字。 其實這玩意相當簡單,首先,js是一門單線程的語言,所 ...
event loop這東西,確實把我坑了一把,面試的時候被問到這個問題的時候,我是懵逼的,完全不知道怎麼回答,而當我回來查到原來這個聽起來如此玄乎又厲害的名字就是非同步和單線程那塊的知識的時候,我心情又變得很複雜,怪我,不知道它有這麼個高級的名字。
其實這玩意相當簡單,首先,js是一門單線程的語言,所謂單線程,一句話就可以講清楚---“js不能同時做兩件事,只能按順序一件一件做”。
這個順序就比較通俗易懂了--“先同步,後非同步”,js在執行代碼的時候,會從上到下執行,如果發現你是一個同步事件,那就立即執行;如果發現你是一個非同步事件,對不起,不管你是延遲0秒還是10秒,只要性質上屬於非同步事件,都放到事件隊列里去等著。等到執行棧中(也就是存放主線程中所有的同步事件的東西)的同步事件處理完成了後,主線程就開始不斷地去事件隊列查詢有沒有可以拉過來執行的事件。(註意:在同步事件剛剛處理結束的時候,如果非同步隊列里有延時函數,它們是同時開始計時的)。
而這個主線程迴圈不斷地去事件隊列里取事件的過程,就叫做事件迴圈。