星期四, 2月 04, 2010

Function中傳遞不定多個參數(.apply() , .call() ) :: 改善doNext

以function 當作 object :: 實作 doNext 之後,又注意到Function內的一個方便的函數

apply(thisArg:*, argArray:*):*
call(thisArg:*, ... args):*

最大的不同就是apply是將參數指定為一個 Array 對象。
如果在腳本實際執行前,無法知道要傳遞的參數的數量,那麼這種方法通常很有用。
(官方文件 : ActionScript 3.0 語言和組件參考 - Function)


一點例子
關於apply的應用:apply關鍵作用還是調整參數個數問題,避免個數不統一。多用在..res這種情況的時候。
package {
    import flash.display.*;
    public class Main extends Sprite{
        public function Main() {
            execFunc(test);
        }       
        private function execFunc(closure:Function, ...rest):void{
           // closure(rest);//如果把下邊的註釋掉改為本行,則
                                   //提示:test() 的參數數量不匹配。應該有 0 個,當前為 1 個。
           closure.apply(this,rest);//此處this換成null也可以。
        }
        private function test():void{
            trace("test");
        }
    }
}

vanchor的actionscript3.0小窩 - as3 將函數作為參數傳遞,及...(res)關鍵字,apply()方法,偵聽函數帶參傳遞



修改過後的doNext:

private function doNext(time:Number, func:Function, ... parameter):void
{
    var timer:Timer = new Timer(time * 1000, 1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE,
        function(e:TimerEvent) { func.apply(null, parameter); );
    timer.start();
}


還沒有考慮garbage collection..

沒有留言:

張貼留言