関数クロージャ使えば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ならば、
メンバをすべて無くすことも可能です。
関数クロージャすっげ!