カテゴリー
ActionScript3

Function.apply

Delegateメソッドクロージャと関連して、Function.apply。
function test1():void{ } で定義したメソッドは apply が効かない。

/* ActionScript3 */

function test1():void{
trace(this);
}

var test2:Function = function():void{
trace(this);
}

var obj:Object = new Object();
this.test1.apply(obj); //結果: [object MainTimeline]
this.test2.apply(obj); //結果: [object Object]

"this 参照が、常にこのメソッドを実装する元のオブジェクトを指している"
が test1 (バインドメソッド)
"this 参照は汎用的で、呼び出されたときにこの関数が関連付けられているオブジェクトを指"す
が test2 (メソッドクロージャ)

メソッド -- Flex 2.01

バインドメソッドは、メソッドクロージャとも呼ばれる、単にインスタンスから抽出されるメソッドです。バインドメソッドの例には、関数にパラメータとして渡され、関数から値として返されるメソッドがあります。ActionScript 3.0 で新しく導入されたバインドメソッドは、インスタンスから抽出されたときでもレキシカル環境が保持されるメソッドクロージャに似ています。バインドメソッドとメソッドクロージャの主な違いは、バインドメソッドの this 参照は、バインドメソッドを実装するインスタンスにリンクされたまま、つまりバインドされたままであるという点です。これは、バインドメソッドの this 参照が、常にこのメソッドを実装する元のオブジェクトを指していることを意味します。メソッドクロージャの場合、this 参照は汎用的で、呼び出されたときにこの関数が関連付けられているオブジェクトを指します。


具体的にありえる使い方?

/* ActionScript3 */

package{
import flash.display.MovieClip;
import caurina.transitions.Tweener;

public class Init{

private var _mc:MovieClip;

public function Init(mc:MovieClip){
this._mc = mc;
fadeOut.apply(this._mc.targMc);
}

var fadeOut:Function = function():void{
Tweener.addTween(this, {alpha:0.5, time:1});
}
}
}

- 参考サイト
FLASH-JP.COM - フォーラム 6861.Function.apply の this について

- 関連エントリー
メソッドクロージャ
Delegate.create

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です