JavaScript 全攻略:克服 JS 的奇怪部分 - 執行環境與詞彙環境(6)

JavaScript 全攻略:克服 JS 的奇怪部分筆記 - 第二章

JavaScript如何處理非同步(asynchronous)的事件

前言

之前有提到,JavaScript是同步運行、一行一行執行的,這樣你就會很好奇,它究竟要怎麼去監控(monitor)瀏覽器的一些事件呢?

如下圖,它是在告訴我們,JS引擎會處理很多的事情,像HTTP request,rendering engine等等..所以它是會接受很多非同步的事件。

所以JavaScript要如何處理非同步的事件?

這邊先提示一個觀念:非同步的事情會先放入一個叫做event queue的東西裡面,JavaScript會先把所有Execution context的事情都做完,才去event queue裡面繼續處理這些事情,如下圖:

如這段Anthony Alicea老師所提供的範例,個人覺得很棒:

function waitThreeSecond(){
  var ms = 3000+ new Date().getTime();
  while(new Date()<ms){
    console.log("finished function")
  }
}

document.addEventListener('click', function(){console.log('click event!'); });

waitThreeSecond();
console.log('finished execution');

這邊的程式碼很簡單,就是去執行一個等3秒的函式,然後有設定一個click事件。

大家可以操作看看,你會發現一個很有趣的事情,你只要在程式開始跑之後去點及滑鼠會發現怎麼點都沒有跳出click event這個console。

一定會去執行完我在exection context的所有code之後

才會跳出這個click event 的 console

這邊我們就可以知道:JavaScript是用同步的方式(一行一行執行程式碼),來處理非同步的事件(如click event)。

參考資料

https://www.udemy.com/javascriptjs/learn/v4/overview