在JavaScript中获取函数名称

有谁知道是否有办法获得JavaScript函数名称。 例如,我有一个像

function test1(){ alert(1); } 

我把它放在我的头部。 然后我创build一个对象obj1并把我的function放在那里

 obj1.func = test1; 

当我在obj1对象中调用一个方法时,除了parsing函数的source( this.func.toString() )外,是否有任何方法让我的函数名(test1)在这个方法内部。

 function test() { alert(arguments.callee.name); } b = test; b(); 

输出“testing”(在Chrome,Firefox和可能的Safari)。 但是, arguments.callee.name只能在函数内部使用。

如果你想从外面得到名字,你可以parsing出来:

 b.toString(); 

但我认为函数对象的名称属性可能是你所需要的:

 alert(b.name); 

但是这对于IE和Opera来说似乎不起作用,所以你只能在这些浏览器中手动parsing它。

在ES2015之前,没有标准的方法来获取函数的名称。 目前大多数浏览器都支持在ES2015之前的非标准的Function对象的name属性,但没有IE的当前版本。 如果你需要支持IE,唯一的select就是试图从函数的string表示中parsing这个名字,这不是一个好主意 。 这里有一个很长的讨论: http : //groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0

这是我用来把错误信息中的类名称。 它包含获取函数名称的代码,可在大多数浏览器中使用。

显然,没有标准的方法总是有效的,所以你应该总是提供一个可以使用的名字,如果没有其他名字被发现。

 var nameFromToStringRegex = /^function\s?([^\s(]*)/; /** * Gets the classname of an object or function if it can. Otherwise returns the provided default. * * Getting the name of a function is not a standard feature, so while this will work in many * cases, it should not be relied upon except for informational messages (eg logging and Error * messages). * * @private */ function className(object, defaultName) { var result = ""; if (typeof object === 'function') { result = object.name || object.toString().match(nameFromToStringRegex)[1]; } else if (typeof object.constructor === 'function') { result = className(object.constructor, defaultName); } return result || defaultName; } 

最好的做法是:

 function functionName(fun) { var ret = fun.toString(); ret = ret.substr('function '.length); ret = ret.substr(0, ret.indexOf('(')); return ret; } 

注意:使用Function.caller是非标准的,在严格模式下禁止使用arguments.callee

我正在尝试的一个有趣的方式是像下面这样的声明:

 var test1 = function test1(){ alert(1); }; 

这是一个小黑客,但最终发生的事情是test1是一个局部variables,它包含一个[Function: test1]对象。

以下是使用基于它的代码时会发生的情况:

 test1(); //runs the function as expected console.log(test1.name); //prints 'test1' 

所以,如果你做到以下几点:

 obj1.func = test1; 

然后你可以引用obj1.func.name ,它会返回'test1'

这可能是最好的办法:

 var myfunc = function () {}; var funcName = myfunc.constructor.name; 

这可以在函数执行之外完成,并且您可以在浏览器控制台的上下文中进行检查。

快乐的编码!

你可以将你的函数转换成一个string(fn + '') ,稍后以空格分割并打开括号 /\s|\(/

 var getFunctionName = function (fn) { return (fn + '').split(/\s|\(/)[1]; };