Подтвердить что ты не робот

Получить имя как String из ссылки на функцию Javascript?

Я хочу сделать обратное Получить объект-функцию JavaScript из его имени в виде строки?

То есть, данный:

function foo()
{}

function bar(callback)
{
  var name = ???; // how to get "foo" from callback?
}

bar(foo);

Как мне получить имя функции за ссылкой?

4b9b3361

Ответ 1

Если вы не можете использовать myFunction.name, вы можете:

// Add a new method available on all function values
Function.prototype.getName = function(){
  // Find zero or more non-paren chars after the function start
  return /function ([^(]*)/.exec( this+"" )[1];
};

Или для современных браузеров, которые не поддерживают свойство name (существуют ли они?), добавьте его напрямую:

if (Function.prototype.name === undefined){
  // Add a custom property to all function values
  // that actually invokes a method to get the value
  Object.defineProperty(Function.prototype,'name',{
    get:function(){
      return /function ([^(]*)/.exec( this+"" )[1];
    }
  });
}

Ответ 2

var name = callback.name;

MDN:

Свойство name возвращает имя функции или пустую строку для анонимных функций:

Live DEMO

Ответ 3

function bar(callback){
    var name=callback.toString();
    var reg=/function ([^\(]*)/;
    return reg.exec(name)[1];
}

>>> function foo() { };
>>> bar(foo);
"foo"
>>> bar(function(){});
""

Ответ 4

Вы можете извлечь имя объекта и функции с помощью:

function getFunctionName()
{
    return (new Error()).stack.split('\n')[2].split(' ')[5];
}

Например:

function MyObject()
{
}

MyObject.prototype.hi = function hi()
{
    console.log(getFunctionName());
};

var myObject = new MyObject();
myObject.hi(); // outputs "MyObject.hi"

Ответ 5

var x = function fooBar(){};
console.log(x.name);
// "fooBar"

Ответ 6

попробуйте получить доступ к свойству .name:

callback.name 

Ответ 7

Если вы искали функцию в конкретном объекте, это может помочь:

var a = document.form1
a.onsubmit.name

Ответ 8

для меня, с небольшой модификацией (добавление\перед родителем), эта работа:

if (Function.prototype.name === undefined){
  // Add a custom property to all function values
  // that actually invokes a method to get the value
  Object.defineProperty(Function.prototype,'name',{
    get:function(){
      return /function ([^\(]*)/.exec( this+"" )[1];
    }
  });
}