addCommand内でのfunctionについて雑感
Progressionでタイムラインスタイルを使っていて、のaddCommand内で、たとえばこう書いたときの話。
やってることは、p1というシーンを表示したときにp1ページ内のボタンの処理を追加しているんですが、問題はここでの「function()」の使い方。
var p1:SceneObject =new SceneObject() p1.name ="p1" p1.onInit =function():void{ this.addCommand( new AddChild(prog.container.p1Page), function(){ p1Page._page.btn.addEventListener(MouseEvent.MOUSE_DOWN,function(){ prog.goto(new SceneId("/index/p2")) //本当はここでif使って、条件によって飛ばすシーンを変えてる } ); } p1.onGoto =function():void{ this.addCommand( p1Page._page.btn.removeEventListener(MouseEvent.MOUSE_DOWN,arguments.callee); ); }
addCommand内のfunctionは、無名関数っつーか、関数リテラルとして実行される、と考えると納得できる。こういうのはその場で1回実行される(言い方はわからないけど、クロージャっていうの?)と理解してるんだけど。
javascriptでいう関数リテラルはこんな感じ。↓
(function(v) {alert(v)}("aho") );
これだと、jsはすぐに実行されて、画面にアラートが出ます。
今日の発見
- addCommand内のfunctionは関数リテラル
- 無名関数でaddEventListenerしたときは、arguments.calleeでremoveできる