Получить имя как String из ссылки на функцию Javascript?
Я хочу сделать обратное Получить объект-функцию JavaScript из его имени в виде строки?
То есть, данный:
function foo()
{}
function bar(callback)
{
var name = ???; // how to get "foo" from callback?
}
bar(foo);
Как мне получить имя функции за ссылкой?
Ответы
Ответ 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];
}
});
}