有没有人知道是否有办法获取JavaScript函数名称。例如,我有一个像
这样的函数function test1(){
alert(1);
}
我的脑袋里有它。然后我创建一个对象obj1并将我的函数放在那里
obj1.func = test1;
当我在obj1对象中调用方法时,除了解析函数的源(this.func.toString()
)之外,我是否有办法在此方法中获取函数名称(test1)。
答案 0 :(得分:50)
function test() { alert(arguments.callee.name); }
b = test;
b();
输出“test”(在Chrome,Firefox和Safari中)。但是,arguments.callee.name
只能从内部函数中获取。
如果您想从外部获取姓名,您可以解析它:
b.toString();
但我认为函数对象的name属性可能是你需要的:
alert(b.name);
然而,这似乎对IE和Opera不起作用,所以你不得在这些浏览器中手动解析它。
答案 1 :(得分:8)
直到ES2015,才有获得函数名称的标准方法。大多数当前浏览器在name
对象上支持Function
属性,这些属性在ES2015之前是非标准的,但没有当前版本的IE。如果你需要支持IE,唯一的选择就是尝试从函数的字符串表示中解析名称,这是不是一个好主意。这里有一个(长期)讨论:http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0
答案 2 :(得分:5)
这是我用来将类名放在错误消息中的内容。它包含获取函数名称的代码,适用于大多数浏览器。
显然,没有标准方法可以始终有效,因此如果找不到其他名称,则应始终提供可以使用的名称。
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;
}
答案 3 :(得分:5)
最好的办法是:
function functionName(fun) {
var ret = fun.toString();
ret = ret.substr('function '.length);
ret = ret.substr(0, ret.indexOf('('));
return ret;
}
注意:使用Function.caller
是非标准的,并且在严格模式下禁止使用arguments.callee
。
答案 4 :(得分:1)
我正在尝试的一个有趣的方法是如下声明:
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'
。
答案 5 :(得分:1)
这可能是最好的方法:
var myfunc = function () {};
var funcName = myfunc.constructor.name;
这可以在执行函数之外完成,您可以在浏览器控制台的上下文中进行检查。
快乐的编码!
答案 6 :(得分:0)
您可以将您的函数转换为字符串(fn + '')
,稍后在空格中拆分并打开括号 /\s|\(/
。
var getFunctionName = function (fn) {
return (fn + '').split(/\s|\(/)[1];
};