代码之家  ›  专栏  ›  技术社区  ›  kalan

获取JavaScript中的函数名

  •  42
  • kalan  · 技术社区  · 16 年前

    有人知道有没有办法得到JavaScript函数名吗。比如我得到了一个函数

    function test1(){
    alert(1);
    }
    

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

    obj1.func = test1;
    

    当我在obj1对象中调用一个方法时,除了解析源代码之外,我还有什么方法可以在这个方法中获得我的函数名(test1)吗( this.func.toString()

    7 回复  |  直到 12 年前
        1
  •  60
  •   Nate Anderson    9 年前
    function test() {  alert(arguments.callee.name); } 
    b = test; 
    b();
    

    输出“test”(在Chrome、Firefox和Safari中)。然而, arguments.callee.name 里面 函数。

    外部

    b.toString();
    

    但我认为函数对象的name属性可能是您需要的:

    alert(b.name);
    

    不过,这似乎不适用于IE和Opera,所以您只能在这些浏览器中手动解析它。

        2
  •  10
  •   Tim Down    10 年前

    直到 ES2015 ,没有获取函数名的标准方法。当前大多数浏览器都支持 name 上的属性 Function 不是个好主意 http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0

        3
  •  8
  •   Vlad A. Ionescu    11 年前

    最好的办法是:

    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
  •  5
  •   kybernetikos    13 年前

    显然,没有一种标准的方法总是有效的,所以您应该始终提供一个在找不到其他名称时可以使用的名称。

    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;
    }
    
        5
  •  1
  •   jdotjdot    13 年前

    我正在尝试的一种有趣的方法是这样的声明:

    var test1 = function test1(){
        alert(1);
    };
    

    test1 是一个局部变量,它包含 [Function: test1]

    使用基于它的代码时会发生以下情况:

    test1(); //runs the function as expected
    console.log(test1.name); //prints 'test1'
    

    obj1.func = test1;
    

    你就可以参考 obj1.func.name 它会回来的 'test1' .

        6
  •  1
  •   imalvinz    11 年前

    这可能是最好的方法:

    var myfunc = function () {};
    var funcName = myfunc.constructor.name;
    

    这可以在函数执行之外完成,并且可以在浏览器控制台的上下文中进行检查。

    快乐的编码!

        7
  •  0
  •   yckart Matthew Crumley    12 年前

    (fn + '') 晚些时候再分 /\s|\(/

    var getFunctionName = function (fn) {
       return (fn + '').split(/\s|\(/)[1];
    };