クロージャをイベントに登録したら、どうやってイベントから削除するの?

無名関数使うと、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