Actioncript - получить имя текущей функции
Я хочу получить имя функции внутри этой функции. например:.
function blah() {
//I want to get the string "blah" here, from the function 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[[email protected]] == callee) return [email protected];
}
return "not found";
}
Обратите внимание, что это не сработает, если вы вызываете someFunction()
из конструктора, потому что объект не полностью создан - describeType(this)
в конструкторе вызовет ошибку компиляции.
Ответ 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
в противном случае, Таким образом, это определенно не решение для развертывания. К сожалению.
Ответ 3
Вероятно, вы не сможете получить имя функции, потому что на самом деле у них нет "имени". Точно так же, как ваши переменные не имеют имен. Они просто указывают на объект.
Получение названия не имеет смысла, отчасти из-за следующего примера:
function foo():void
{
//get function name.
}
var bar:Function = foo;
bar();
Функция аналогична любому другому объекту/переменной. Какое "имя" будет искать эта функция? "Foo"? или "бар"? Оба foo и bar ссылаются на одну и ту же переменную типа Function.
Лучшим способом справиться с этим было бы передать что-то в функцию в качестве аргумента:
function foo(myName:String):void
{
trace(myName);
}
Однако вы можете получить ссылку на текущую функцию, используя arguments.callee:)
Ответ 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
когда мне нужны идентификаторы для функций для реализации моей системы событий, я не нашел способ получить доступ к name
не анонимной функции, переданной как аргумент, поэтому мне пришлось написать оболочку, которая ничего не хранила, кроме Function
и его ID