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」をお読みください。