3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

addEventListener() メソッドの引数 listener に設定するコールバック関数で、引数 (event)を省略した場合でも動作する理由

Posted at

addEventListener() メソッドの引数 listener に設定するコールバック関数は、引数 (event) を省略した場合でも動作する。具体的には、次の通り「引数を省略しない場合」と「引数を省略した場合」が同様に動作する。

sample1.js
// 引数を省略しない場合('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 オブジェクトを引数に取る。

handleEvent()
eventListener.handleEvent(event);

そのため、前述「引数を省略する場合」のように記述することは、動作はするがそもそも望ましくないと考えられる。動作する理由は、引数を省略した場合でも(引数を省略しない場合の)event に相当するデータを window.event にて取得できているため。したがって、"結果的に"同様に動作する。

引数を省略した場合をより正確に記述すると次の通りになる。

sample2.js
// 引数を省略する場合
document.getElementById('sampleElement').addEventListener('click', () => {
  window.event.target.style.backgroundColor = 'red';
});

つまり、引数を省略しない場合の event.target と 引数を省略しない場合の event.target は一見して同じ記述であるようにも見受けられるが、実は引数を省略する場合の event.targetwindow.event.target であり、(結果的に動作は同様となるものの)別物である。

最後に window.event は MDN にて次の通り使用を避けるよう記述がある点を伝え、解説を終える。

新しいコードではこのプロパティの使用を避けるべきであり、代わりにイベントハンドラー関数になる Event を使用してください。このプロパティは広くサポートされておらず、またサポートされていてもコードが壊れやすくなるおそれがあります。
引用元: Window.event - Web API | MDN

以上。

To JavaScript 有識者の方。もし内容に誤りがあればぜひご指摘願いたい。

[参考] EventTarget.addEventListener() - Web API | MDN

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?