addEventListener()
メソッドの引数 listener
に設定するコールバック関数は、引数 (event) を省略した場合でも動作する。具体的には、次の通り「引数を省略しない場合」と「引数を省略した場合」が同様に動作する。
// 引数を省略しない場合('event'を引数として設定)
document.getElementById('sampleElement').addEventListener('click', (event) => {
event.target.style.backgroundColor = 'red';
});
// 引数を省略する場合
document.getElementById('sampleElement').addEventListener('click', () => {
event.target.style.backgroundColor = 'red';
});
Q. なぜ引数を省略しても動作するのか
A. 引数を省略する場合の event
は、window.event
を指し、現在サイトのコードが処理している Event を返すため。
解説
addEventListener()
メソッドの引数 listener
に設定するコールバック関数は、handleEvent()
メソッドを有する。handleEvent()
の構文は次の通り event オブジェクトを引数に取る。
eventListener.handleEvent(event);
そのため、前述「引数を省略する場合」のように記述することは、動作はするがそもそも望ましくないと考えられる。動作する理由は、引数を省略した場合でも(引数を省略しない場合の)event
に相当するデータを window.event
にて取得できているため。したがって、"結果的に"同様に動作する。
引数を省略した場合をより正確に記述すると次の通りになる。
// 引数を省略する場合
document.getElementById('sampleElement').addEventListener('click', () => {
window.event.target.style.backgroundColor = 'red';
});
つまり、引数を省略しない場合の event.target
と 引数を省略しない場合の event.target
は一見して同じ記述であるようにも見受けられるが、実は引数を省略する場合の event.target
は window.event.target
であり、(結果的に動作は同様となるものの)別物である。
最後に window.event
は MDN にて次の通り使用を避けるよう記述がある点を伝え、解説を終える。
新しいコードではこのプロパティの使用を避けるべきであり、代わりにイベントハンドラー関数になる Event を使用してください。このプロパティは広くサポートされておらず、またサポートされていてもコードが壊れやすくなるおそれがあります。
引用元: Window.event - Web API | MDN
以上。
To JavaScript 有識者の方。もし内容に誤りがあればぜひご指摘願いたい。