Есть ли способ найти имя вызывающей функции в actionscript2?

В функции (методе) ActionScript у меня есть доступ к arguments.caller, который возвращает объект Function, но я не могу узнать имя функции, представленной этим объектом Function. Его toString () просто возвращает [Function], и я не могу найти других полезных средств доступа, которые дают мне это ... Помощь :-/

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 815
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Функция - это такой же объект, как и любой другой - у нее нет «имени» само по себе; у него есть имя только в том смысле, что вы можете сделать одну или несколько ссылок на него. Если вы спрашиваете, как получить имя ссылки, по которой была вызвана функция, то общего способа сделать это не существует. (В конце концов, функция может быть объявлена ​​анонимно, и в этом случае у нее вообще нет имени.)

Вероятно, было бы лучше изучить, почему вам нужно знать имя функции, и найти другой способ передать или получить доступ к информации, которую вы пытаетесь получить из этого имени. Одним из подходов может быть передача дополнительного параметра, но это зависит от того, что вы делаете.

Насколько я знаю, не в AS2 Только AS3.

Ответ принят как подходящий

Я нашел ответ и вставлю его ниже.

@fenomas: да, конечно, вы правы, функции - это просто объекты, и я ищу имя ссылки на них (если существует, т.е. функция не анонимна). Вы также правы, что в целом это не похоже на лучший способ программирования ;-) Но мой сценарий особенный: я хочу реализовать класс Checks (аналогичный C CHECK) с такими методами, как Check.checkTrue и Checks. 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:   }

Другие вопросы по теме