このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Closureのイベントハンドラー:状況わろし

goog.events.EventHandler(component) がまたなんつーか、「イベントハンドラー」という言葉の多義性の新しい例で、イベント処理用のバインディングを行うlisten関数を所有するオブジェクト、ということになる。

いわゆるイベントハンドラー関数とは全然違う。いわゆるイベントハンドラー関数は、listen関数の第三引数に指定される。んで、listen関数は、eh.listen(target, eventType, handler) として使う。ehがClosureのEventHandlerオブジェクトなのだ。んじゃ、listenの第三引数は何と呼ぶか? イベントリスナーだな。

つまり、Closureにおけるイベントハンドラーとイベントリスナーはまったくの別物。もちろん、DOMの用語ともXMLEventsの用語とも整合しない。XMLEventsのリスナーに近いのがlisten関数。イベントハンドラーのlistenは goog.events.litenの使いやすいラッパーになっている。

Closureイベントハンドラーは、イベント処理のバインディングを管理する責任主体みいたもので、イベントターゲット(発生源)ともリスナーの所有者とも概念的には別。

さらにややこしいのは、EventHandlerオブジェクトに handler_ というプロパティがあって、これがハンドラーを指している。ええええー、ハンドラーからハンドラーを指すってナニソレ?

EventHandlerオブジェクトは、別なとあるオブジェクトに所有されることがあって、その所有者をhandler_が指している。この所有者もハンドラーと呼ぶのだ、、、、ムムムムム。handler_は、リスナー関数群の所有者であることが多い。

理解を促すスニペット

/**
 * Stops listening to the events.
 * @private
 */
goog.ui.LabelInput.prototype.detachEvents_ = function() {
  if (this.eventHandler_) {
    this.eventHandler_.dispose();
    this.eventHandler_ = null;
  }
};

さらに悪いニュース:リスナー関数のネーミングは handleXxx (Xxxはイベント名)。ウギャ!