Event driven與Exception架構很類似
我們可以做個類比:
Event <--> Exception
它們都是這個架構的資訊攜帶者,自訂Event可以讓我們攜帶各種需要傳遞的物件,如同Exception可以攜帶各種錯誤訊息甚至錯誤物件往外傳播。
不同的地方在於,Exception的型態(type)決定了會被哪個catch抓到,而Event在initialization時必須給予一個事件代號,例如
new MouseEvent("click"),代表他是一個滑鼠的按鈕事件,當事件傳播出去後,只有指名要抓click代號的handler才能抓到此Event
dispatchEvent <--> throw
一樣都是將資訊向外傳播的方法,dispatchEvent是將Event傳播到UI元件的樹上,而throw是將Exception傳到call stack上。
例如 Window --> Form --> Button 的UI樹上,在Button上觸發的Event會一路傳到Form,再傳到Window上,若沒有UI有註冊聆聽此事件,Event會一路往外傳到最上層。Exception的傳遞非常類似,都是將Exception在function call stack上一路往外丟,沒有function實際catch時,就會丟給VM。
addEventListener <--> catch
攔截資訊的方法,catch指名要攔截哪個Exception,而addEventListener指名要攔截哪個Event,一樣的是攔截後Exception與Event原則上不會再往上(往外)傳播,除非使用者自己繼續throw Exception/dispatchEvent。
這兩種架構不一樣的地方在Exception有強制宣告的性質,若底層呼叫的method/function會throw某種VM無法處理的Exception,使用者必須自己寫處理方式,無論是繼續往上丟,或者自己寫try catch block處理,但是Event沒有此限制,因此若一個物件會dispatch某種自訂Event,上層元件不必強制處理此Event。