40

我想做与Get JavaScript function-object from its name as a string 相反吗?

也就是说,给定:

function foo()
{}

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

bar(foo);

如何获取引用后面的函数名称?

4

8 回答 8

31

如果你不能使用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];
    }
  });
}
于 2012-05-16T18:03:38.537 回答
19
var name = callback.name;

MDN

name 属性返回函数的名称,或者匿名函数的空字符串:

现场演示

于 2012-05-16T18:01:17.780 回答
6
function bar(callback){
    var name=callback.toString();
    var reg=/function ([^\(]*)/;
    return reg.exec(name)[1];
}

>>> function foo() { };
>>> bar(foo);
"foo"
>>> bar(function(){});
""
于 2012-05-16T18:09:38.717 回答
2
var x = function fooBar(){};
console.log(x.name);
// "fooBar"
于 2012-05-16T18:02:59.900 回答
2

您可以使用以下方法提取对象和函数名称:

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"
于 2014-10-30T12:17:46.047 回答
1

尝试访问该.name属性:

callback.name 
于 2012-05-16T18:03:16.270 回答
0

如果您正在寻找特定对象事件的函数,这可能会有所帮助:

var a = document.form1
a.onsubmit.name
于 2013-04-22T14:32:49.630 回答
0

对我来说,只需稍作修改(在父级之前添加 \),这项工作:

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];
    }
  });
}
于 2014-11-24T09:12:21.930 回答