as3非显式函数指针

时间:2011-06-29 22:08:12

标签: actionscript-3 function pointers

请参阅下面的代码。我将有一堆元素,我想运行“公式”所指的任何元素。在代码中,它说“这有用”,它按预期工作。但是我需要触发这些公式,而不明确命名“firstElement”。即使嵌套for循环有点笨重,我认为它应该工作,但它会导致下面列出的错误。如何在不明确命名元素的情况下触发公式?谢谢!

    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");

    }

3 个答案:

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

答案 1 :(得分:1)

(var object ...)中的变量对象不是类型变量。编译器会将其默认为Object类,当然这不是Function类。尝试将对象转换为函数。我猜你已经从Function类扩展了myFunction。

通过:     for(var object:test.element [index]中的函数)

或     for(var object:myFunction ...)//如果myFunction是从Function

扩展的

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