我想从该函数中获取函数的名称。 e.g:
function blah() {
//I want to get the string "blah" here, from the function's name
}
或者至少是Function对象?
答案 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