在JavaScript中获取函数名称

时间:2010-07-05 10:52:20

标签: javascript

有没有人知道是否有办法获取JavaScript函数名称。例如,我有一个像

这样的函数
function test1(){
alert(1);
}

我的脑袋里有它。然后我创建一个对象obj1并将我的函数放在那里

obj1.func = test1;

当我在obj1对象中调用方法时,除了解析函数的源(this.func.toString())之外,我是否有办法在此方法中获取函数名称(test1)。

7 个答案:

答案 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];
};