匿名関数とコールバック関数の記述

名前付き関数は、その定義前または定義後にスクリプト内で参照できる関数です。一方、"匿名関数" は名前のない関数で、作成時にそれ自体を参照します。ActionScript コードを記述するときは、多数の匿名関数を作成することになります。

匿名関数は、イベントハンドラを作成する場合によく使用されます。匿名関数を記述するには、変数内に関数リテラルを格納します。このことにより、それ以降のコードで関数を参照できます。次の例に、匿名関数の記述方法を示します。

匿名関数を記述するには :

  1. ステージ上にムービークリップを作成し、そのクリップを選択します。
  2. プロパティインスペクタを開き、[インスタンス名] テキストボックスに「my_mc」と入力します。
  3. タイムラインのフレーム 1 を選択し、[アクション] パネルに次のコードを入力します。
    var myWidth = function () {
        trace(my_mc._width);
    };
    // コードの後の部分で追加可能
    myWidth();
    
  4. [制御]-[ムービープレビュー] を選択します。

    ムービークリップの幅が [出力] パネルに表示されます。

関数は、XML インスタンスや LoadVars インスタンスなどのオブジェクト内に作成することもできます。匿名関数を特定のイベントに関連付けると、"コールバック関数" を作成できます。コールバック関数は、ロードの完了 (onLoad()) 後またはアニメーションの完了 (onMotionFinished()) 後など、特定のイベントの発生後に関数から呼び出されます。

たとえば、サーバーから SWF ファイルにロードされるデータを処理する ActionScript を記述しなければならないことがあります。SWF ファイルへのデータのロードが終了すると、その場所からデータにアクセスできます。ActionScript を使用してデータが完全にロードされたかどうかをチェックすることが重要です。コールバック関数を使って、データがドキュメントにロードされたことを通知することもできます。

リモート XML ドキュメントをロードする次のコールバック関数では、匿名関数を onLoad() イベントに関連付けます。次の例に示すように、XML.load() とコールバック関数を使用します。タイムラインのフレーム 1 に次のコードを入力します。

var my_xml:XML = new XML();
my_xml.onLoad = function(success:Boolean):Void {
    trace(success);
};
my_xml.load("http://www.helpexamples.com/crossdomain.xml");

前のコードから、onLoad() イベントハンドラは匿名関数を使用して onLoad() イベントを処理していることがわかります。

コールバック関数の詳細については、イベントの処理を参照してください。

次のコードのように、匿名関数を setInterval() 関数と共に使用することもできます。このコードでは、setInterval() を使用して約 1000 ミリ秒 (1 秒) ごとに匿名関数を呼び出します。

setInterval(function() {trace("interval");}, 1000);

匿名関数の代わりに、名前付き関数を使用することもできます。コールバック関数などの一部の状況を除き、多くの場合、名前付き関数は匿名関数に比べて解読や理解が容易です。また、名前付き関数は前方参照することもできます。つまり、関数がタイムライン上に現れる前に参照できます。

名前付き関数とは異なり、匿名関数は、変数に割り当てない限り、コードのどこからでも参照できるわけではありません。たとえば、次のように、FLA ファイルのフレーム 5 に匿名関数があるとします。

//タイムラインにわたる my_mc というムービークリップの場合
stop();
var myWidth = function () {
    trace(my_mc._width);
};

次のコードをフレーム 1 に配置した場合は、関数を参照できません。

myWidth();

同様に、次のコードをどのフレームに配置しても、正常に動作しません。

myWidth();
var myWidth:Function = function () {
    trace(my_mc._width);
};

ただし、次のコードは正常に動作します。

var myWidth:Function = function () {
    trace(my_mc._width);
};
myWidth();

メモ

 

また、myWidth 関数があるフレームより後であれば、任意のフレームに myWidth() を配置できます。

名前付き関数を定義する場合、フレームスクリプトでの名前付き関数の呼び出しは正常に動作しますが、匿名関数を使用した同様のコードは正常に動作しません。

// 次のコードは、名前付き関数を呼び出しているので、正常に動作する
myWidth();
function myWidth() {
    trace("foo");
}
// 次のコードは、匿名関数を呼び出しているので、正常に動作しない
myWidth();
var myWidth:Function = function () {
    trace("foo");
};

詳細については、名前付き関数の記述を参照してください。

メモ

 

スクリプトアシストを使用してコードを記述する方法については、『Flash ユーザーガイド』を参照してください。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000751.html