1

在 actionscript 函数(方法)中,我可以访问 arguments.caller,它返回一个 Function 对象,但我找不到此 Function 对象表示的函数的名称。它的 toString() 只返回 [Function] 并且我找不到任何其他有用的访问器给我...帮助:-/

4

3 回答 3

1

函数只是一个对象,就像任何其他对象一样——它本身没有“名称”;它只有一个名称,您可能会对其进行一次或多次引用。如果您要问的是如何获取调用函数的引用的名称,那么没有通用的方法可以做到这一点。(毕竟函数可以匿名声明,在这种情况下它根本没有名字。)

最好检查一下为什么您需要知道函数的名称,并找出其他方法来传递或访问您试图从该名称派生的信息。传入一个额外的参数可能是一种方法,但这取决于你在做什么。

于 2008-11-11T07:06:15.320 回答
1

我找到了答案,我将其粘贴在下面。

@fenomas:是的,你当然是对的,函数只是对象,我正在寻找的是对它们的引用的名称(如果存在,即函数不是匿名的)。你也对,一般来说这看起来不是最好的编程方式;-) 但我的场景很特别:我想用 Check.checkTrue 和 Checks 等方法实现一个 Checks 类(类似于 C CHECK)。 checkRef 当检查失败时,我会得到一个很好的跟踪。跟踪只会出现在调试版本中,不会出现在发布版本中。

我正在使用 MTASC,下面的代码仅适用于 MTASC。它也应该仅用于调试目的而不是发布。该技术是迭代 _global 并找到一个与我的调用函数相等的函数。这是一个并不总是有效的技巧(匿名),但在大多数情况下它对我很有帮助。

39:   /**
40:    * Checks that cond is true. Use this method to validate that condition
41:    * cond holds.
42:    * If cond is false, traces a severe message and returns false to indicate
43:    * check failure.
44:    *
45:    * @param cond the contition expected to be true
46:    * @param msg the message to emit in case the condition is false.
47:    *
48:    * @return false is cond is false
49:    */
50:   public static function checkTrue(cond:Boolean, msg:String):Boolean {
51:     if (!cond) {
52:       trace("severe", "CHECK FAILED at " +
53:           **getFunctionName(arguments.caller)** + ":\n" + msg);
54:     }
55:     return cond;
56:   }


94:   /**
95:    * Gets the name of the function func.
96:    * Warning: Use this only in debug version, not in release
98:    *
99:    * @return The full package path to the function. null if the function
100:    *      isn't found.
101:    */
102:   private static function getFunctionName(func:Function):String {
103:     var name:String = getFunctionNameRecursive(func, _global);
108:     return name;
109:   }
110: 
111:   /**
112:    * Gets the name of the function func by recursively iterating over root.
113:    * Warning: Use this only in debug version, not in release
114:    */
115:   private static function getFunctionNameRecursive(func:Function,
116:       root:Object):String {
117:     if (!root) {
118:       return null;
119:     }
120: 
121:     // Iterate over classes in this package
122:     // A class is a function with a prototype object
123:     for (var i:String in root) {
124:       if (root[i] instanceof Function && root[i].prototype != null) {
125:         // Found a class.
126:         // Iterate over class static members to see if there's a match
127:         for (var f:String in root[i]) {
128:           if(root[i][f] == func) {
129:             return i + "." + f;
130:           }
131:         }
132:         // Loop over the class's prototype to look for instance methods
133:         var instance:Object = root[i].prototype;
134:         // Reveal prototype's methods.
135:         // Warning: Not to be used in production code!!!
136:         // The following line make all the instance attributes visible to the
137:         // for-in construct. The "n" value is 8 which means "unhide"
138:         // See http://osflash.org/flashcoders/undocumented/assetpropflags
139:         // This operation is later undone by setting the "n" to 1 which means
140:         // "hide"
141:         _global.ASSetPropFlags(instance, null, 8, 1);
142:         for (var f:String in instance) {
143:           if(instance[f] == func) {
144:             return i + "." + f;
145:           }
146:         }
147:         // And hide instance methods again
148:         // This line undoes the previous ASSetPropFlags
149:         _global.ASSetPropFlags(instance, null, 1, false);
150:       }
151:     }
152: 
153:     // Iterate over sub packages. Sub packages have type "object"
154:     for (var i:String in root) {
155:       if (typeof(root[i]) == "object") {
156:         var name:String = getFunctionNameRecursive(func, root[i]);
157:         if (name) {
158:           return i + "." + name;
159:         }
160:       }
161:     }
162:     return null;
163:   }
于 2008-11-16T22:06:27.977 回答
0

据我所知,不只在AS2 AS3 中。

于 2008-11-12T21:31:23.983 回答