AS3,FlashDevelop:这个[]在返回函数中不起作用

时间:2013-04-23 21:02:54

标签: actionscript-3 return this 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函数中使用this []:无论你通过它引用什么,它都将跟踪为undefined。

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

同样,Timer在函数中被实例化,因为我需要相互独立地执行大量不同的操作,而不是一个Timer控制它。

有点像给予比赛的戒指而不是一枚戒指 - 尽管你可以说你可以说单圈仍在控制其他戒指,但让我们先停下来。

1 个答案:

答案 0 :(得分: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);
}   

此外,代码可能没有完全符合您的要求......但它会给您提供想法!