[AS3] クロージャについて [Edit]

ActionScript 3.0の関数(メソッド)では、ローカル変数や引数以外のthisを含めた参照はその定義時に決まります。このようなデータ構造を、「クロージャ」と呼ぶことがあります[*1]。関数(メソッド)本体内のthis参照も、それが定義されたインスタンスに定まります。ですからthis参照は、Function.apply()メソッドの第1引数で変えることも基本的にできません(つまり、第1引数に指定するできるのはthisのみになります)。

ただし例外として、名前のない関数があります。名前のない関数は、それを変数やプロパティに代入したとき、その変数またはプロパティの参照先がthis参照となります。たとえば、つぎのフレームアクション(スクリプト001)では、タイムライン変数に設定された関数からはthisがそのタイムラインになり、MovieClipインスタンスをターゲットに呼出した関数内では設定されたインスタンスがthisとして参照されます。

スクリプト001■名前のない関数のthis参照
// フレームアクション
var my_mc:MovieClip = new MovieClip();
var name_str:String = "main";
my_mc.name_str = "my_mc";
var xTest:Function = function ():void {   // 名前のない関数定義
  trace([name_str, this.name_str]);
};
my_mc.xTest = xTest;
// [1]直接関数を呼出し
xTest();   // 出力: main,main
// [2]MovieClipインスタンスに設定した関数を呼出し
my_mc.xTest();   // 出力: main,my_mc

名前のない関数については、以下のフレームアクションのようにFunction.apply()メソッドを使ってthis参照が変えられます。

スクリプト002■名前のない関数に対してFunction.apply()メソッドを呼出し
// フレームアクション
var my_mc:MovieClip = new MovieClip();
var name_str:String = "main";
my_mc.name_str = "my_mc";
var xTest:Function = function ():void {
  trace([name_str, this.name_str]);
};
xTest.apply(my_mc) // 出力: main,my_mc;

[*1] [ヘルプ]の[ActionScript 3.0のプログラミング] > [ActionScript 言語とシンタックス] > [関数] > [関数のスコープ]参照。なお、ActionScript 2.0と比較した関数(メソッド)とthisの参照先については、FumioNonaka.com「関数・メソッドとthis」をお読みください。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事