获取包含该函数的匿名变量的名称

时间:2014-01-22 17:49:10

标签: javascript anonymous-function

我有功能

function getCallingFunctionName() {
    alert(arguments.callee.caller.name.toString();
}

var bob = function() {
    ...
    getCallingFunctionName();
}

运行代码时,提醒的值是返回空字符串。我需要回来

 bob

我无法更改原始功能(即时通讯处理具有数千种功能的大型项目等。

var bob = function bob() {
    ...
    getCallingFunctionName();
}

任何人都有其他想法吗?它并不重要,但基本上可以帮助调试。

2 个答案:

答案 0 :(得分:1)

如果你尝试这样做会怎么样:

function getCallingFunctionName() {
    try {
        throw new Error();
    }
    catch(e) {
        console.log(e);
    }
}

var bob = function() {
    getCallingFunctionName();
}

它会给你这样的东西:

Error
    at getCallingFunctionName (<anonymous>:4:15)
    at bob (<anonymous>:12:5)
    at <anonymous>:2:1
    at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
    at Object.InjectedScript.evaluate (<anonymous>:459:21) 

您可以将其用于您的目的,即提取功能名称。唯一可悲的是IE从版本10开始支持Error.stack

答案 1 :(得分:0)

这是一种方法,需要一些额外的努力/代码,但也许它适合你:

var cache = {};

var bob = function () {
    getCallingFunctionName();
}

function getCallingFunctionName() {
    alert(cache[arguments.callee.caller.toString()]);
}

cache[bob.toString()] = "bob";

bob(); //bob

所以你基本上是缓存函数字符串表示(这是完整的函数体)并将其用作实际函数名的键。之后,您只能再次使用func.toString()来访问该名称。当然,这要求你没有两个具有完全相同身体的功能。