0

嗯,这很有趣——至少对我来说,在我的无知中。让代码说话:

    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 有针对性,其余的仅供参考,希望能更好地理解它。注意在返回函数中 this[] 的使用:无论您通过它引用什么,它都将跟踪为未定义。

为什么这样?是因为 this[] 不能在 return 部分中使用,还是因为 return 是一个函数?我已经做了一个解决方法(一个丑陋的解决方法,涉及通过返回调用另一个函数,我可以使 this[] 工作),但我想知道原因是什么。

同样,计时器在函数中被实例化,因为我需要大量不同的彼此独立运行,而不是一个计时器来管理它。

有点像给种族的戒指,而不是一戒——尽管你可能会说一戒仍然控制着其他戒指,但让我们在那之前停下来。

4

1 回答 1

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);
}   

此外,代码可能不会完全按照您的意愿行事......但它会给您这个想法!

于 2013-04-23T21:28:41.677 回答