一、JavaScript是單執行緒語言
為什麼JavaScript是單執行緒語言?作為瀏覽器指令碼語言,JavaScript的主要用途是與使用者互動,以及操作DOM。這決定了它只能是單執行緒,否則會帶來很複雜的同步問題。
比如涉及很多I/O(輸入/輸出)操作,那麼執行緒的執行大概是下面的樣子。

而如果採用多執行緒,同時執行多個任務,那很可能就是下面這樣。

Event Loop就是為了解決這個問題而提出的。
二、Event Loop
Event Loop意為事件迴圈。是一種執行機制。主執行緒從"任務佇列"中讀取事件,這個過程是迴圈不斷的。
簡單說,就是在程式中設定兩個執行緒:一個負責程式本身的執行,稱為"主執行緒";另一個負責主執行緒與其他程式(主要是各種I/O操作)的通訊,被稱為"Event Loop執行緒"(可以譯為"訊息執行緒")。

上圖主執行緒的綠色部分,還是表示執行時間,而橙色部分表示空閒時間。每當遇到I/O的時候,主執行緒就讓Event Loop執行緒去通知相應的I/O程式,然後接著往後執行,所以不存在紅色的等待時間。等到I/O程式完成操作,Event Loop執行緒再把結果返回主執行緒。主執行緒就呼叫事先設定的回撥函式,完成整個任務。
可以看到,由於多出了橙色的空閒時間,所以主執行緒得以執行更多的任務,這就提高了效率。這種執行方式稱為"非同步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)。
三、總結
當然瀏覽器環境的Event Loop和Node.js的事件迴圈機制是不一樣的。 瀏覽器環境下的Event Loop會解決單執行緒執行帶來的一些問題。