咱們知道,在觸發DOM上的某個事件時,會產生一個事件對象,其中包含與事件相關的全部信息。JS高程中有這樣一句話,兼容DOM的瀏覽器會將一個事件對象傳入到事件處理程序中,不管指定事件處理程序時使用什麼方法,DOM0級或是DOM2級別,都會傳入事件對象。 javascript
事件處理程序有參數時直覺上還好理解,可是事件處理程序要是一個參數都沒有指定,事件對象真的會傳入事件處理程序嗎?
以一個按鈕<input type="button" value="Click Me" id="myBtn">
爲樣本,咱們能夠看看是否真的如此。java
var btn = document.getElementById("myBtn"); function showMessage() { console.log("Clicked"); console.log(arguments.length); console.log(arguments[0].type); } btn.onclick = showMessage;
上面代碼,使用DOM0級的方法爲按鈕myBtn
綁定了一個沒有指定任何參數的事件處理程序,點擊按鈕後,控制檯依次輸出Clicked
、1
、click
。arguments
對象是一個類數組對象,包含着傳入函數中的全部參數,利用它,咱們能夠得到關於參數的信息。從結果能夠看出,瀏覽器確實將一個事件對象傳入到事件處理程序,即使事件處理程序沒有指定任何參數。
下面,看看事件處理程序指定參數的狀況。數組
var btn = document.getElementById("myBtn"); function showMessage(event) { console.log("Clicked"); console.log(arguments.length); console.log(arguments[0] === event); console.log(event.type); } btn.onclick = showMessage;
點擊按鈕後,控制檯依次輸出Clicked
、1
、true
、click
。從結果能夠得出,傳入一個參數時,該參數名成爲arguments[0]
的別名,參數和arguments[0]
指向同一個對象。由於是別名,因此傳入的參數名能夠是任何合法的標識符,之因此使用標識符event
,是由於它更能表意,也是你們默認的習慣。
如今,能夠得出結論了,不管指定事件處理程序時使用什麼方法,事件處理程序始終有一個參數,也就是事件對象,由瀏覽器傳入,保存在arguments[0]。瀏覽器