【发布时间】:2011-06-11 13:01:16
【问题描述】:
我想从函数内部获取函数的名称。例如:
function blah() {
//I want to get the string "blah" here, from the function's name
}
或者至少是 Function 对象?
【问题讨论】:
标签: flash actionscript-3 actionscript adobe
我想从函数内部获取函数的名称。例如:
function blah() {
//I want to get the string "blah" here, from the function's name
}
或者至少是 Function 对象?
【问题讨论】:
标签: flash actionscript-3 actionscript adobe
使用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";
}
请注意,当您从构造函数调用 someFunction() 时,这将不起作用,因为该对象未完全实例化 - 构造函数中的 describeType(this) 会导致编译错误。
【讨论】:
this[m.@name] 替换为 parent[m.@name]
我只是通过堆栈跟踪来完成的,这是 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。所以这绝对不是一个可部署的解决方案。对不起。
【讨论】:
For Flash Player 11.4 and earlier and AIR 3.4 and earlier, stack traces are only available when code is running in the debugger version of Flash Player or the AIR Debug Launcher (ADL). In non-debugger versions of those runtimes, calling this method returns null. - help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
您可能无法获得函数的名称,因为它们真的没有这样的“名称”。就像您的变量没有名称一样。它们只是指向对象的指针。
获取名称没有意义,部分原因是以下示例:
function foo():void
{
//get function name.
}
var bar:Function = foo;
bar();
函数就像任何其他对象/变量一样。这个函数会找到什么“名字”? “富”?还是“酒吧”? foo 和 bar 都引用了 Function 类型的同一个变量。
处理这个问题的更好方法是将一些东西作为参数传递给函数:
function foo(myName:String):void
{
trace(myName);
}
但是,您可以使用 arguments.callee 获取对当前函数的引用 :)
【讨论】:
为了在 Actionscript 2 中实现这一点,我最近不得不使用一些遗留代码
function getFunctionName(func:Function):String
{
for(var prop in this)
{
if(this[prop] == func)
{
return prop;
break;
}
}
}
然后像这样使用它
trace(getFunctionName(arguments.callee));
【讨论】:
当我需要事件系统实现的函数 ID 时,我没有找到访问作为参数传递的非匿名函数的 name 的方法,因此我不得不编写一个除了 @ 之外什么都不存储的包装器987654322@及其ID
【讨论】: