这很有趣 - 至少对我而言,在我的无知中。让代码说:
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控制它。
有点像给予比赛的戒指而不是一枚戒指 - 尽管你可以说你可以说单圈仍在控制其他戒指,但让我们先停下来。
答案 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);
}
此外,代码可能没有完全符合您的要求......但它会给您提供想法!