2013-04-23 49 views
0

這很有趣 - 至少對我來說,我的無知是。讓代碼說話:AS3,FlashDevelop:這個[]不能在返回函數中使用

public function textSfx(chPos:int, otlPos:int):void 
    { 
     var sfxTimer:Timer = new Timer (100, 12); 
     trace("statSfx fired"); 
     this["textCh" + chPos + "Stat"].text = this["otl" + otlPos + "Type"] + ": " + this["endOtl" + otlPos + "Stat"];   
     sfxTimer.addEventListener(TimerEvent.TIMER, textSfxHandler(chPos, sfxTimer)); 
     sfxTimer.start();   
    } 

    public function textSfxHandler(chPos:int, sfxTimer:Timer):Function 
    { 
     return function(evt:TimerEvent):void 
     { 
      trace(this["anything"]); 
     } 
    } 

請注意,只有textSfxHandler是針對性的在這裏,剩下的就是爲參照希望更好地理解它。注意在返回函數中使用這個[]:不管你通過它引用什麼,它都會跟蹤爲未定義的。

爲什麼這樣?是因爲這個[]不能用在return部分,還是因爲return是一個函數?我已經做了一個解決方法(一個醜陋的解決方法,涉及通過返回一個函數調用另一個函數,我可以使這個[]工作),但我想知道原因是什麼。

同樣,定時器是在函數內實例化的,因爲我需要大量不同的獨立於彼此的行爲,而不是一個Timer來管理它。

有點像給予比賽的戒指而不是一個戒指 - 儘管猜測你可能會爭論一個戒指仍然控制其他戒指,但是我們在此之前停止。

回答

2

通常在上下文中調用函數,這是通過'this'關鍵字引用的。匿名函數(在代碼中返回)沒有上下文,因此也是您的問題。

這樣做的一個清潔的解決方案可能是有另一個類,比如說,TimerHandler像:

public class TimerHandler 
{ 
    private var _callback:Function; 
    private var _chPos:int; 
    private var _otlPos:int; 

    public function TimerHandler(callback:Function, chPod:int, otlPod:int) 
    { 
     _callback = callback; 
     _chPod = chPod; 
     _otlPos= otlPos; 
    } 

    public function timerHandler(event:TimerEvent):void 
    { 
     _callback(_chPos, _otlPos); 
    } 
} 

,並用它作爲

public function textSfx(chPos:int, otlPos:int):void 
{ 
    var sfxTimer:Timer = new Timer (100, 12); 
    trace("statSfx fired"); 
    this["textCh" + chPos + "Stat"].text = this["otl" + otlPos + "Type"] + ": " + this["endOtl" + otlPos + "Stat"];   

    var sfxTimerHandler:TimerHandler = new TimerHadler(textSfxHandler, chPos, otlPos); 
    sfxTimer.addEventListener(TimerEvent.TIMER, chPos, sfxTimerHandler.timerHandler);//note I'm not calling timerHandler here... just passing a reference to it. 
    sfxTimer.start();   
} 

public function textSfxHandler(chPos:int, otlPos:int):void 
{ 
    trace('chPos: ' + chPos + '; otlPos: ' + otlPos); 
} 

此外,代碼可能不會做什麼你想...但它會給你想法,但!

+0

啊,看到我認爲雙胞胎功能正在返回而不是回報本身,謝謝天主教徒!大聲笑將不得不慢慢地通過我的原始知識儘管你的代碼雖然之前可以實現,但我非常感謝幫助:) – ReaperOscuro 2013-04-24 18:56:34

+0

這將是很好,如果你標記的答案是正確的,如果它解決了你的問題:) – catholicon 2013-04-24 19:10:06

+0

大聲抱歉,我以爲我有!告訴你:無知!現在,回過頭來回答我的其他問題,然後! – ReaperOscuro 2013-04-25 06:53:34