クロージャをイベントに登録したら、どうやってイベントから削除するの?
無名関数使うと、removeEventListener()出来ないんじゃないの?
っていうコメントがあったので。
それぐらい出来るよ!
その1 一時変数に入れておく
誰でも思いつく方法。
変数に入れて変数名でアクセスすれば解決。
public function Main():void { var f:Function = function(e:Event):void { trace("hello"); removeEventListener(Event.ENTER_FRAME, f); } addEventListener(Event.ENTER_FRAME, f); }
実行してみると、"hello"、と一回出るだけ。
え?いちいち変数作るのめんどくさいって?
その2 arguments.calleを使う
無名関数自身にアクセスする方法はないだろうか?
もちろんあるよ!arguments.calleつかえばいいよ!
public function Main():void { addEventListener(Event.ENTER_FRAME, function(e:Event):void { trace("hello"); removeEventListener(Event.ENTER_FRAME, arguments.callee); }); }
arguments.calleというのは、現在実行している関数への参照。
上の例では、arguments.calleの中に無名関数が入っている。
ちなみに、メソッドでもクロージャでもどちらの場合でも使える。
arguments.calle使えば無名関数で再起も出来るよ!
(function(i:int):void { trace(i); if (i > 0) { arguments.callee(i - 1); } })(5); // => 5 4 3 2 1 0