この記事のURL

http://www.dango-itimi.com/blog/archives/2005/000699.html


FLASH tips クロージャ

Flashでクロージャ

最初は なんだこれはと混乱しそうですが、用途例を説明する場合「例えば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以外にも 無名関数を指定する命令は沢山あるので 用途を見つけて有用していきたいですね。スコープも上記例の様に設定しなくてもいい場合がでてきます。但し、クロージャは関数の入れ子状態になるとも言えるので、コードの読みやすさを考えると多用は禁物?

[ FLASH ] [ tips ] 投稿者 siratama : 2005年04月18日 12:11

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/662

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]