0

関数パラメーターに基づいて、addEventListener内から動的に関数名を呼び出したいと思います。

と呼んでnewMod("moduleA", "A");いますが、エラーが発生していますTypeError: Error #1006: value is not a function.

この関数を動的に呼び出す方法に関する提案。使用に関するいくつかの回答を見てきました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ため、ハンドラーはクラスのすべてのメンバーにアクセスできます。これには、周囲のメソッドで宣言された変数、クラスのプライベート変数/メソッド、およびクラスの継承チェーン全体の保護された変数/メソッドが含まれます。

Ivan Dyachenkothisが書いたように、ハンドラー関数が実際にはトップレベルクラスのインスタンスであるという問題があります。したがって、Functionオブジェクトでメソッドを呼び出そうとすると、他のオブジェクトでメソッドを呼び出すのと同じになります-オブジェクトを参照します。あなたの場合、これはFunctionオブジェクトになります。ただし、関数には呼び出したいメソッドがありません。Functionthisthis

さらに、コードで別の問題が発生します。イベントハンドラーをインラインで作成するため、引数として直接、addEventListener()後でイベントリスナーを削除することはできません。ここで説明するようにuseWeakReferenceパラメーターonを使用するか、ハンドラー関数を変数に格納して参照を保持し、後で。で削除する必要があります。addEventListener()removeEventListener()

于 2012-08-30T14:30:32.683 に答える