динамически вызывать функцию - PullRequest
2 голосов
/ 02 июня 2011

Как мы можем динамически вызывать функцию. Я пробовал ниже код:

public function checkFunc() : void
{
  Alert.show("inside function");
}
public var myfunc:String = "checkFunc";
public var newFunc:Function=Function(myfunc);
newFunc();

Но выдает ошибку:

вызов возможно неопределенного метода newFunc.

Вместо newFunc() я попытался назвать его как this[newFunc](), но это выдает ошибку:

Это ключевое слово нельзя использовать в статические методы. Может использоваться только в методы экземпляра, замыкания функций, и глобальный код

Помогаете ли вы в динамическом вызове функции?

Ответы [ 4 ]

5 голосов
/ 03 июня 2011

Функции работают так же, как свойства, вы можете назначать их так же, как присваиваете переменные, это означает, что все хитрые квадратные скобки работают и для них.

public function checkFunc() : void
{
  Alert.show("inside function");
}
public var myfunc:String = "checkFunc";
public var newFunc:Function = this[myfunc];
newFunc();
3 голосов
/ 02 июня 2011

С ответ Taskinoor на этот вопрос :

instance1[functionName]();

Проверьте это для некоторых деталей.

2 голосов
/ 02 июня 2011

Код не проверен, но должен работать

package {
  public class SomeClass{
    public function SomeClass( ):void{
    }
    public function someFunc( val:String ):void{
      trace(val);
    }
    public function someOtherFunc( ):void{
      this['someFunc']('this string is passed from inside the class');
    }
  }
}


// usage 
var someClass:SomeClass = new SomeClass( );
someClass['someFunc']('this string is passed as a parameter');
someClass.someOtherFunc();







// mxml example
// Again untested code but, you should be able to cut and paste this example.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="someOtherFunc( )" >
  <mx:Script>
    <![CDATA[
      public function someFunc( val:String ):void{
        trace(val);
        this.theLabel.text = val
      }
      public function someOtherFunc( ):void{

        // this is where call the function using a string
        this['someFunc']('this string is passed from inside the class');
      }
    ]]>
  </mx:Script>

  <mx:Label id="theLabel" />
</mx:Application>
1 голос
/ 02 июня 2011

Функции во флэш-памяти являются объектами, и как таковые функции, как и любой объект.API AS3 показывает, что функция имеет метод call ().Вы очень близки в своем коде:

// Get your functions
var func : Function = someFunction;

// call() has some parameters to achieve varying types of function calling and params
// I typically have found myself using call( null, args );
func.call( null );  // Calls a function
func.call( null, param1, param2 );  // Calls a function with parameters
...