衝撃!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);
}
今度やってみよう
リファレンス奥深し・・・