0

我想根据函数参数从 addEventListener 内部动态调用函数名。

打电话newMod("moduleA", "A");但是我收到错误TypeError: Error #1006: value is not a function.

关于如何动态调用此函数的任何建议。我已经看到了一些使用 an 的答案,instance[function]()但不确定它如何适用于听众,

public function newMod(mdLd,evtTyp,param):void {
   info = ModuleManager.getModule(mdLd);
   var mevth:String =  ("modEventHandler"+(evtTyp));
   info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){
                this[mevth](e, param)});
   info.load(null, null, null, moduleFactory);
}
private function modEventHandlerA(e:ModuleEvent):void {
    vg1.addElement(info.factory.create() as IVisualElement);
    }

[编辑] 看起来像是改变了对this[mevth]()作品的调用,但我似乎无法根据需要传递额外的参数,即this[mevth](parm)欢迎任何建议。

我还更新了侦听器以包含一个函数调用,但仍然没有乐趣

4

2 回答 2

1

当您创建闭包时,“this”并不指向真实实例“this”。你可以写这样的东西

public function newMod(mdLd,evtTyp,param):void {
   info = ModuleManager.getModule(mdLd);
   var self:Object = this;
   var mevth:String =  ("modEventHandler"+(evtTyp));
   info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){
                self[mevth](e, param)});
   info.load(null, null, null, moduleFactory);
}

...

但是我真的不建议你写这样的代码。

于 2012-08-22T11:34:33.157 回答
0

要遮盖您的评论:

函数闭包意味着函数会记住创建它的上下文。在您的代码中,以下行创建了一个闭包:

info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){
            this[mevth](e, param)});

事件处理函数是在包含方法的类的上下文中创建的public function newMod(mdLd,evtTyp,param):void,因此您的处理程序可以访问该类的所有成员。这包括在周围方法中声明的变量、类的私有变量/方法和类的整个继承链中的受保护变量/方法。

this正如Ivan Dyachenko所写的那样,问题在于您的处理程序函数实际上是顶级类的一个实例Function。因此,如果您尝试this在 Function 对象中调用方法,它将与在任何其他对象中调用方法相同 -this指的是对象。在您的情况下,这将是 Function 对象。但是您的函数没有您要调用的方法。

此外,您的代码还会遇到另一个问题。因为您创建了内联事件处理程序 - 直接作为addEventListener()您的参数,以后将无法删除事件侦听器。您应该使用此处所述的useWeakReference参数 on或将处理函数存储在变量中以保存对其的引用,以便稍后使用.addEventListener()removeEventListener()

于 2012-08-30T14:30:32.683 回答