トップページ > 関数 > 無名関数とは



概要

無名関数とはその名のとおり名前が付いてない関数のことです。

これは匿名関数とも呼ばれているのですが、無名匿名どっちを使うのかは人それぞれですね。
元々の英語のスペルは、Anonymous functionなので、そのまま日本語に訳すと匿名関数になりますね。

ただ、別に関数名を隠しているわけではなく本当に名前が無い関数なので、自分は無名関数と呼んでいます。


プログラム

var func:Function = function():void { trace("関数名が無い!!"); }
 
このように無名関数ではメソッド名を省略します。
この無名関数を一つのオブジェクト、値として扱うことが出来るので、Function型変数に代入することが出来ます。

この時点で、中身のtrace()が実行されることはありません。


func(); // 関数名が無い!! が出力される
 
実行するためには無名関数を受け取ったfuncに()を付けてあげます。
これでどこからでも呼ぶことが出来ますね。



(function():void { trace("関数名が無い!!"); })();
 
ちょっとややこしいですが、このように無名関数自体に括弧を付けて、さらにその右側に関数を呼び出す括弧を付けてあげるとその場でtrace()が出力されます。


public function Main()
{
	stage.addEventListener(MouseEvent.CLICK, onMouseClick);
}
 
private function onMouseClick(event:MouseEvent):void
{
	trace(mouseX, mouseY);
}
 
クリックした座標を出力させるにはこのようなコードを書きますよね。
ただ、trace()させるだけでいちいちメソッドを書くのは面倒というときがあります。


stage.addEventListener(MouseEvent.CLICK, function():void { trace(mouseX, mouseY); } );
 
その場合は無名関数を使用すると簡潔に書くことが出来ます。


public function Main()
{
	var value:int = 30;
	stage.addEventListener(MouseEvent.CLICK, function():void { trace(value); } );
}
 
クリックするとvalue変数に入っている値を出力するコードです。
もし、onMouseClickのような別のメソッドを定義してしまうと、valueの値をonMouseClickに渡す方法を考えなければなりません。
最悪、ローカル変数をインスタンスフィールドに変更するということもありえるわけですが、無名関数を使用すると呼び出し元のメソッド内にある変数も使用できます。

便利なのですが、クロージャという機能の弊害が出る可能性があるので注意してください。
このクロージャについてはまた別のエントリーで説明します。


検証用コード

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
 
	public class Main extends Sprite
	{
		public function Main()
		{
			stage.addEventListener(MouseEvent.CLICK, function():void { trace(mouseX, mouseY); } );
		}
	}
}
 

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|