Actionscript - получить имя текущей функции. - PullRequest
14 голосов
/ 19 января 2011

Я хочу получить имя функции внутри этой функции. e.g.:

function blah() {
    //I want to get the string "blah" here, from the function's name
}

Или хотя бы объект Function?

Ответы [ 5 ]

26 голосов
/ 19 января 2011

Используйте arguments.callee , чтобы получить ссылку на текущую функцию.

Если вы хотите получить имя функции, это немного сложнее: все функции обрабатываются как замыкания методов (фрагменты кода, которые могут быть переданы в качестве аргумента), поэтому они не имеют ссылки натип включающего класса, и при этом у них нет «текущего имени».

Однако, если (и только if) метод является общедоступным, и вы хотите получить имя метода из объявления класса объекта экземпляра, содержащего метод, вы можете использовать descriptionType :

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) в конструкторе вызовет ошибку компиляции.

5 голосов
/ 19 января 2011

Я только что сделал это с трассировкой стека, что показывает отладчик 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. Так что это определенно не развертываемое решение. К сожалению.

2 голосов
/ 04 марта 2013

Чтобы осуществить это в Actionscript 2, что я недавно сделал с устаревшим кодом

function getFunctionName(func:Function):String
{
  for(var prop in this)
  {
    if(this[prop] == func)
    {
      return prop;
      break;
    }
  }
}

И используйте это как-то так

trace(getFunctionName(arguments.callee));
2 голосов
/ 19 января 2011

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

Получение имени не имеет смысла, отчасти из-за следующего примера:

function foo():void 
{
    //get function name.
}
var bar:Function = foo;
bar();

Функция похожа на любой другой объект / переменную.Какое «имя» найдет эта функция?"Foo"?или "бар"?И foo, и bar ссылаются на одну и ту же переменную типа Функция .

Лучший способ справиться с этим - передать что-либо в функцию в качестве аргумента:

function foo(myName:String):void 
{
    trace(myName);
}

Однако вы можете получить ссылку на текущую функцию, используя arguments.callee :)

0 голосов
/ 19 января 2011

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

...