在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]; };