Actionscript - 获取当前函数的名称
Posted
技术标签:
【中文标题】Actionscript - 获取当前函数的名称【英文标题】:Actionscript - Obtain the name of the current function 【发布时间】:2011-06-11 13:01:16 【问题描述】:我想从函数内部获取函数的名称。例如:
function blah()
//I want to get the string "blah" here, from the function's name
或者至少是 Function 对象?
【问题讨论】:
【参考方案1】:使用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]
这实际上是一个错误。感谢您引起我的注意,@kriswelsh【参考方案2】:
我只是通过堆栈跟踪来完成的,这是 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
。所以这绝对不是一个可部署的解决方案。对不起。
【讨论】:
从 11.5 及更高版本开始,它可用于非调试器版本。引用,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/…【参考方案3】:
您可能无法获得函数的名称,因为它们真的没有这样的“名称”。就像您的变量没有名称一样。它们只是指向对象的指针。
获取名称没有意义,部分原因是以下示例:
function foo():void
//get function name.
var bar:Function = foo;
bar();
函数就像任何其他对象/变量一样。这个函数会找到什么“名字”? “富”?还是“酒吧”? foo 和 bar 都引用了 Function 类型的同一个变量。
处理这个问题的更好方法是将一些东西作为参数传递给函数:
function foo(myName:String):void
trace(myName);
但是,您可以使用 arguments.callee 获取对当前函数的引用 :)
【讨论】:
我觉得你说的话真的很难相信。即使当我编译一个发布版本的 Flex 应用程序时,跟踪语句被抑制并且没有源视图,如果抛出未处理的错误,Flash Player 也会为我提供一系列方法按名称,包括关联的类和它的各自的包。这表明函数 name 信息肯定被编码到 swf 中,因此应该可以以某种方式访问。 ...不同之处在于堆栈是“从外部”跟踪的,作为一种内省操作,它允许知道程序的整个类和对象层次结构,虽然这是不可能的从函数体内。如果您想拥有类似的功能,您总是可以拥有某种“自定义堆栈”来跟踪您的对象的方法调用。 @weltraumpirat - 感谢您澄清这一点。【参考方案4】:为了在 Actionscript 2 中实现这一点,我最近不得不使用一些遗留代码
function getFunctionName(func:Function):String
for(var prop in this)
if(this[prop] == func)
return prop;
break;
然后像这样使用它
trace(getFunctionName(arguments.callee));
【讨论】:
【参考方案5】:当我需要事件系统实现的函数 ID 时,我没有找到访问作为参数传递的非匿名函数的 name
的方法,因此我不得不编写一个除了 @ 之外什么都不存储的包装器987654322@及其ID
【讨论】:
以上是关于Actionscript - 获取当前函数的名称的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 ActionScript 3通过函数名称的字符串表示来调用函数