addEventListenerメソッドで、関数を設定する際に「関数名();」を記述しなくとも処理が実行される理由
古いイベントハンドラの設定/解除の実装の歴史を書くとこんな感じでした。
- handleEvent, releaseEvent (Netscape Navigator の実装)
- attachEvent, detachEvent (Internet Explorer の実装)
- addEventListener, removeEventListener (モダンな実装)
※ 2. 以降に着目してください。
IEがモダンな実装に変わるころ、addEventListener
, removeEventListener
はDOMオブジェクトにしか実装されておらず、自作のオブジェクトには、イベント伝搬機能を偽装する必要がありました。
で、以下のようなコードを書いて解決していました。
javascript
1// 自作の Ctor.prototype に mixin してイベント伝搬機能を偽装
2const MyEventDispatcher = {
3 listeners : {}
4, addEventListener: function( type, listener ) {
5 if( !this.listeners[type] ) {
6 this.listeners[type] = [];
7 }
8 this.listeners[type].push( listener );
9 }
10, removeEventListener: function( type, listener ) {
11 var index = this.listeners[type].indexOf( listener );
12 if( !~~index ) {
13 this.listeners.splice( index, 1 );
14 }
15 }
16, dispatchEvent: function( event ) {
17 var self = this;
18 var type = event.type;
19 var listeners = this.listeners[type];
20
21 for( vae i=0,l=listeners.length; i<l; ++i) {
22 var listener = listeners[i];
23 listener.call( self, event );
24 }
25 }
26};
無名関数でも良い理由
Document Object Model Events では、ご質問の無名関数でも良い理由に該当する内容は見当たりませんが、上記の偽装方法のように listeners[type] = listenr
の形で イベントリスナ(関数オブジェクトの参照)が内部で保持されているのだとしたら、関数の名前は必要ないと考えられます。