Actionscript - 获取当前函数的名称

Fra*_*rth 14 flash adobe actionscript actionscript-3

我想从该函数内部获取函数的名称.例如:

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

或者至少是Function对象?

wel*_*rat 26

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

我想获取函数名称,它有点棘手:所有函数都被视为方法闭包(可以作为参数传递的代码段),因此它们不拥有对封闭类类型的引用,也不他们有一个"现在的名字".

但是,如果(且当)方法是公共的,并且您想要从包含该方法的实例对象的类声明中获取方法名称,则可以使用describeType:

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";
}
Run Code Online (Sandbox Code Playgroud)

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


mer*_*erv 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
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:重要警告

AS3参考郎说,的getStackTrace方法仅适用于Flash Player/AIR的调试器版本,并且将返回null,否则.所以这绝对不是一个可部署的解决方案.抱歉.