EventTarget.addEventListenerでイベントを登録した時、そのイベントの実体はどこに登録されるのか
モチベーション
要素追加時に、その要素にeventを登録したとする。
その後、その要素が削除され、かつその要素がどこからも参照されていない時、登録されたイベントはどうなるのか気になった。
もし、上記の状態でもイベントが削除されないのであれば、removeEventListenerで明示的に削除する必要がでてくる(ただ、残っていたからといってどの程度影響があるのかという話もあるが未調査)。
そもそもこいつはどこにイベントを登録するのだろう。
そういう訳で仕様書を当たることにした。
仕様書ではEventTargetのEvent Listener List に登録される事になっている。
MDNを見ると、addEventListener
の項目は EventTarget
項目内にある。
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
つまり、addEventListener
は EventTarget
インスタンスのメソッドで、こいつを調べようと思ったら、EventTarget
について調べたら良さそう。
ちなみにEventTarget
オブジェクトはwindow
から生えている。
念の為。
document instanceof EventTarget // true document.createElement('div') instanceof EventTarget // true
へぇ、そうなんだ🤔という気持ちになった。
以下はwhatwgのEventTargetの仕様書。
原文
日本語
この中にこのような記述がある。
Each EventTarget object has an associated event listener list (a list of zero or more event listeners). It is initially the empty list.
日本語だとこう
各 EventTarget object には、 イベントリスナリスト が結び付けられる — それは、 0 個以上のイベントリスナからなるリストであり,初期時には空とする。
更にFor web developers (non-normative)(このブロックは Web 開発者向けであり、規範的ではない。)
という緑色の項目内、 target . addEventListener(type, callback [, options])
の欄に以下の記述もある
Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.
target のイベントリスナリストに[ type 属性値が type であるイベント用のイベントリスナ ]を付加する。 callback 引数が,イベントが配送されたときに呼び出される callback として設定される。
ということは、EventTarget
が addEventListener
で登録されるEvent Listener List
を保持していると言えそうなので、EventTarget
が削除されれば、自ずとEvent Listener List
も削除されるのでは?ということがわかる。
ちなみに、Event Listener List
を観測するためのメソッドはEventTarget
インスタンスに生えていないため、Event Listener List
を実際に観測することは現状できない様子。
(それを観測するためにどうこうするみたいな記事は出てくるが、実体を確認することは今の所できない様子。)
以上
よろしく💪