衝撃!argumentsの底力

このリファレンスを見て欲しい
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/arguments.html

今までASで何がめんどくさいってaddEventListener&removeEventListenerです。

最近オープンソースのcorelibとかSparkのソース見てて知ったんだけど、
argumentsてのをFunctionが持ってて、argumentsはcalleeてのを持っている。
たとえば今までCREATION_COMPLETEをリスナーするとき、どうせ一度しか出てこないのに


public function construct() {
addEventListener(FlexEvent.CREATION_COMPLETE,onCreationComplete);
}

private function onCreationComplete(e:FlexEvent):void {
removeEventListener(FlexEvent.CREATION_COMPLETE,onCreationComplete);
//処理
}

というお決まりのを書いて、もう何でもかんでもイベントドリブンだから、
Commandパターンを使って完了通知をCOMPLETEとか使おうもんなら、ハンドラの名前が無くなってきて長くなって・・・
見にくくなって・・・
という最悪スパイラルを生み出していて、
じゃあ、無名関数なんて思ったら、remove出来なくてガベージコレクタが効かずメモリをどんどん消費するなんてことでした


でも、arguments.calleeがあればもう大丈夫

arguments.calleeはthis的なもので今コールされているファンクションが何かってもの


だから、1回実行したらさようならなもの達はすかざずこうすればよかったのです。


public function construct() {
addEventListener(FlexEvent.CREATION_COMPLETE,function():void{
removeEventListener(FlexEvent.CREATION_COMPLETE,arguments.callee);
//処理
} );
}

でもってコピペするためにこういう風にすればもう完璧!!!


public function construct() {
addEventListener(FlexEvent.CREATION_COMPLETE,function(e:Event):void{
e.target.removeEventListener(e.type, arguments.callee);
//処理
});
}

まてよ?

こんなことは出来るンか?


public var handler:Function = function(e:Event, func:Function, ...args):void {
e.target.removeEventListener(e.type, arguments.callee);
func.apply(this, args);
}

今度やってみよう
リファレンス奥深し・・・