有谁知道是否有办法获取JavaScript函数名称.例如,我有一个像这样的功能
function test1(){
alert(1);
}
Run Code Online (Sandbox Code Playgroud)
我把它放在我的头部.然后我创建一个对象obj1并将我的函数放在那里
obj1.func = test1;
Run Code Online (Sandbox Code Playgroud)
当我在obj1对象中调用一个方法时,除了解析this.func.toString()函数的source()之外,我有没有办法在这个方法中获取我的函数名(test1).
Kam*_*zot 52
function test() { alert(arguments.callee.name); }
b = test;
b();
Run Code Online (Sandbox Code Playgroud)
输出"test"(在Chrome,Firefox和Safari中).但是,arguments.callee.name只能从功能内部获得.
如果你想从外面获取名字,你可以解析它:
b.toString();
Run Code Online (Sandbox Code Playgroud)
但我认为函数对象的name属性可能是你需要的:
alert(b.name);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不适用于IE和Opera,因此您可以在这些浏览器中手动解析它.
在ES2015之前,没有标准的方法来获取函数的名称.name在FunctionES2015之前,大多数当前浏览器都支持非标准对象的属性,但没有当前版本的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;
}
Run Code Online (Sandbox Code Playgroud)
注意:使用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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58684 次 |
| 最近记录: |