2011-06-29 14 views
1

以下のコードを参照してください。私は要素の束を持って、その要素のために "数式"が何を参照していても実行したいと思う。このコードでは、 "これは動作します"と表示され、期待どおりに動作します。しかし、私は明示的に "firstElement"という名前を付けずに、これらの式を無効にする必要があります。入れ子にされたforループはちょっとしたものですが、うまくいくはずですが、以下のエラーが発生します。要素に明示的に名前を付けることなく、式を消去するにはどうすればよいですか?ありがとう!as3非明示的な関数ポインタ

var test:Object = { 
     element: 
     [ 
      { "firstElement": 
       { 
        formula:myFunction 
       } 
      } 
     ] 
    }// end test object 


    public function RunThisFunctionFirst() { 

     test.element[0].firstElement.formula();//this works 

     for (var index in test.element){ 
      for (var object in test.element[index]){ 
       trace ("object " + object);// traces "firstElement", as expected 
       object.formula()// this causes error: Error #1006: value is not a function. 
      } 
     } 
    } 

    function myFunction(){ 
     trace ("my function called"); 

    } 

答えて

0

から延長された場合外側のループに関しては、elementはオブジェクトではなく配列なので、for(;;)ではなくfor inを使用します。

内側ループに関して、objectは文字列であり、"firstElement"はオブジェクトではありません。

for (var i:int=0; i < test.element.length; i++) 
{ 
    for (var key:* in test.element[i]) 
    { 
     trace("key " + key); 
     var object:* = test.element[i][key]; 
     trace("object " + object); 
     if(typeof object === "object" && object.hasOwnProperty("formula")) 
      object.formula(); 
    } 
} 
1

(var object ...)の変数オブジェクトは型付き変数ではありません。コンパイラはこれをデフォルトでObjectクラスに設定しますが、もちろんFunctionクラスではありません。オブジェクトを関数としてキャストしてみてください。私は関数クラスからmyFunctionを拡張していると思います。

いずれかによって: ため(VARオブジェクト:test.elementにおける関数[インデックス])

又は(VARオブジェクト:MyFunctionを...)のための// MyFunctionを、関数

2

あなたのループを簡素化することができますfor eachループを使用して、以前にあなたの変数を入力することを忘れないでください、言った:

for each (var elm:Object in test.element) { 
    for each (var obj:Object in elm) { 
     var formula:Function = obj.formula as Function 
     if (formula!=null) formula() 
    } 
} 
関連する問題