在JavaScript中获取函数名称

kal*_*lan 44 javascript

有谁知道是否有办法获取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,因此您可以在这些浏览器中手动解析它.

  • 两件事,这是[已弃用](https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Functions_and_function_scope/arguments/callee)并且在IE中无效,甚至IE8 :) (13认同)
  • 更重要的是,IE中不支持`Function`对象的非标准`name`属性. (12认同)
  • FYI function.name是"ECMAScript 2015(ES6)标准的一部分",因此应该是未来证明(但今天可能无法在任何地方使用).请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name (3认同)

Tim*_*own 8

ES2015之前,没有标准的方法来获取函数的名称.nameFunctionES2015之前,大多数当前浏览器都支持非标准对象的属性,但没有当前版本的IE.如果你需要支持IE,唯一的选择就是尝试从函数的字符串表示中解析名称,这不是一个好主意.这里有一个(长期)讨论:http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0

  • 怎么样?如果历史证明了什么,那就恰恰相反:今天有效的是关于唯一能保证在明天的浏览器中工作的东西.任何以向后不兼容的方式改变的浏览器,打破现有网站,将明智地自杀市场份额. (4认同)

Vla*_*scu 7

最好的办法是:

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,严格模式下禁止使用.


kyb*_*kos 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;
}
Run Code Online (Sandbox Code Playgroud)