有谁知道是否有办法获取 JavaScript 函数名称。例如,我有一个类似的功能
function test1(){
alert(1);
}
我有它在我的头部部分。然后我创建一个对象 obj1 并将我的函数放在那里
obj1.func = test1;
当我调用 obj1 对象中的方法时,除了解析this.func.toString()
函数的源 ( )外,我有没有办法在该方法中获取我的函数名称 (test1) 。
有谁知道是否有办法获取 JavaScript 函数名称。例如,我有一个类似的功能
function test1(){
alert(1);
}
我有它在我的头部部分。然后我创建一个对象 obj1 并将我的函数放在那里
obj1.func = test1;
当我调用 obj1 对象中的方法时,除了解析this.func.toString()
函数的源 ( )外,我有没有办法在该方法中获取我的函数名称 (test1) 。
function test() { alert(arguments.callee.name); }
b = test;
b();
输出“测试”(在 Chrome、Firefox 和可能的 Safari 中)。但是,arguments.callee.name
只能从函数内部使用。
如果您想从外部获取名称,您可以将其解析为:
b.toString();
但我认为函数对象的 name 属性可能是您需要的:
alert(b.name);
然而,这似乎不适用于 IE 和 Opera,因此您只能在这些浏览器中手动解析它。
在ES2015之前,没有标准的方法来获取函数的名称。当前大多数浏览器都支持ES2015 之前非标准的对象name
属性Function
,但当前版本的 IE 不支持。如果您需要支持 IE,唯一的选择是尝试从函数的字符串表示中解析名称,这不是一个好主意。这里有一个(长)讨论:http : //groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0
最好的做法是:
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 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 (e.g. 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;
}
我正在试验的一种有趣方式是如下声明:
var test1 = function test1(){
alert(1);
};
这有点hacky,但最终发生的test1
是一个保存[Function: test1]
对象的局部变量。
当您使用基于它的代码时,会发生以下情况:
test1(); //runs the function as expected
console.log(test1.name); //prints 'test1'
因此,如果您执行以下操作:
obj1.func = test1;
然后,您将能够引用obj1.func.name
,它会返回'test1'
.