関数クロージャ使えばprivateなメンバが消えてなくなるよ!

クロージャネタでいつまで引っ張る気だよ!って声がそろそろ聞こえてきそう・・・。
俺のクロージャネタは108式まであるぞ!


ActionScript書いてて余計なメンバが増えることって無い?
数個なら気にならないけど、それが増えてきたら気持ち悪いよね。
関数クロージャを使いこなせば余計なメンバも定義する必要もなくなるぜ!

関数クロージャを使わなかった場合

例えば60〜0までのカウントをTextFieldで表示するものを作ろうとした場合。

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	
	public class Main extends Sprite 
	{
		private var _tf:TextField;
		private var _count:int;
		public function Main():void 
		{
			_count = 60;
			_tf = new TextField();
			addChild(_tf);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(e:Event):void 
		{
			_tf.text = "count" + _count--;
			
			if (_count < 0)
			{
				removeEventListener(Event.ENTER_FRAME, onEnterFrame);
			}
		}
	}
}

wonderfl build flash online | 面白法人カヤック


このように書くのがふつー。
ただ、_tfと_countはonEnterFrame()の中でしか使ってないのに、
メンバとして宣言しないといけないのはちょっと微妙。

関数クロージャを使った場合

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	
	public class Main extends Sprite
	{
		public function Main()
		{
			var tf:TextField = new TextField();
			addChild(tf);
			var count:int = 60;
			addEventListener(Event.ENTER_FRAME, function(e:Event):void {
				tf.text = "count" + count--;
				if (count < 0)
				{
					removeEventListener(Event.ENTER_FRAME, arguments.callee);
				}
			});
		}
	}
}

関数クロージャを使った場合 | wonderfl build flash online


あれ?tfとcountがメンバじゃなくなったぞ!
ついでにonEnterFrame()も消えちゃった!


コードを見ると、関数クロージャの中からtfやcountにアクセスしている。
これは、レキシカルスコープという関数クロージャ特有のスコープのおかげです。
関数クロージャの中から外の変数が見える。


このレキシカルスコープと関数クロージャを使えば、コンストラクタ以外のすべてのメンバがprivateならば、
メンバをすべて無くすことも可能です。


関数クロージャすっげ!