Actionscript - 获取当前函数的名称

时间:2011-01-19 05:06:44

标签: flash actionscript-3 actionscript adobe

我想从该函数中获取函数的名称。 e.g:

function blah() {
    //I want to get the string "blah" here, from the function's name
}

或者至少是Function对象?

5 个答案:

答案 0 :(得分:26)

使用arguments.callee获取对当前函数的引用。

我想获取函数名称,它有点棘手:所有函数都被视为方法闭包(可作为参数传递的代码片段),因此它们不拥有对封闭类的引用类型,也没有“当前名称”。

但是,如果(并且 if)该方法是公共的,并且您希望从包含该方法的实例对象的类声明中获取方法名称,则可以使用{{3} }:

public function someFunction() : void {
    var callee:Function = arguments.callee;
    trace (getFunctionName(callee, this)); // ==> someFunction
}

private function someOtherFunction() : void {
    var callee:Function = arguments.callee;
    trace (getFunctionName(callee, this)); // ==> not found
}

private function getFunctionName (callee:Function, parent:Object):String {
    for each ( var m:XML in describeType(parent)..method) {
        if ( parent[m.@name] == callee) return m.@name;
    }
    return "not found";
}

请注意,当您从构造函数调用someFunction()时,这不起作用,因为该对象未完全实例化 - 构造函数中的describeType(this)会导致编译错误。

答案 1 :(得分:5)

我刚刚使用堆栈跟踪来完成它,这是Flash Player调试器在抛出未处理错误时显示的内容。这是我的实施:

function blah()
{
    var e:Error = new Error();
    var s:String = e.getStackTrace();
    var functionName:String = s.slice(s.indexOf('/')+1, s.indexOf('('));
    trace(functionName); //blah
}

如果你想让它成为一个单独的函数,你可能需要让字符串的解析更有趣。但是函数名称肯定在堆栈跟踪中。

编辑:重要提示

AS3 Lang Ref表示getStackTrace方法仅适用于Flash Player / AIR的调试器版本,否则将返回null。所以这绝对不是一个可部署的解决方案。遗憾。

答案 2 :(得分:2)

你可能无法获得一个函数的名称,因为它们 没有这样的“名称”。就像你的变量没有名字一样。它们只是指向对象的指针。

获取名称没有意义,部分原因在于以下示例:

function foo():void 
{
    //get function name.
}
var bar:Function = foo;
bar();

函数就像任何其他对象/变量一样。这个函数会找到什么“名字”? “富”?还是“酒吧”? foo和bar都引用了Function类型的相同变量。

处理此问题的更好方法是将某些内容作为参数传递给函数:

function foo(myName:String):void 
{
    trace(myName);
}

但是,您可以使用arguments.callee获取对当前函数的引用:)

答案 3 :(得分:2)

要在Actionscript 2中实现这一点,我最近必须使用一些遗留代码

function getFunctionName(func:Function):String
{
  for(var prop in this)
  {
    if(this[prop] == func)
    {
      return prop;
      break;
    }
  }
}

并使用类似这样的东西

trace(getFunctionName(arguments.callee));

答案 4 :(得分:0)

当我需要用于我的事件系统实现的函数的ID时,我没有找到一种方法来访问作为参数传递的非匿名函数的name,所以我不得不编写一个除了之外什么都不存储的包装器Function及其ID