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