クロージャ
最初は なんだこれはと混乱しそうですが、用途例を説明する場合「例えばonEnterFrameに指定する関数に引数を(間接的に)指定できる」と言えば わかりそう。
onEnterFrameは以下(a)(b)のように関数の参照を指定して機能させます。指定する関数には引数無しのものしか指定することはできません。
(a)MovieClip.onEnterFrame = function(){};
(b)MovieClip.onEnterFrame = function名;
この関数の参照を渡すという点に注目して『関数の参照を返却する関数』をonEnterFrameに指定することにより、クロージャという書き方が実現するようです。
用途は、(b)のような関数名をonEnterFrameに指定する場合に見えてきそうです。大抵、(b)のように関数名を指定する場合は、その指定する関数内の処理が複雑でライン数も多い場合(20Lineくらい)、またはonEnterFrame以外からも指定した関数の呼び出しがある場合です。
【 通常の記述例 】
class Sample{ var num:Number; function Sample( mc:MovieClip ){ this.num = 1; mc[ "scope" ] = this; mc.onEnterFrame = move; } function move():Void{ this = this[ "scope" ]; ・ ・ 長い処理 ・ ・ trace( this.num ); } }
【 クロージャ 】フィールドにデータを持つ必要がなくなる
class Sample{ function Sample( mc:MovieClip ){ var num = 1; mc.onEnterFrame = move( num ); } function move( num:Number ):Function{ return function():Void{ ・ ・ 長い処理 ・ ・ trace( num ); }; } }
move内のreturn行の手前に、初期値設定を行うラインを加えたりすることも可能。
onEnterFrame以外にも 無名関数を指定する命令は沢山あるので 用途を見つけて有用していきたいですね。スコープも上記例の様に設定しなくてもいい場合がでてきます。但し、クロージャは関数の入れ子状態になるとも言えるので、コードの読みやすさを考えると多用は禁物?