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

3

我有这些功能

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

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

当代码运行时,弹出的值是一个空字符串。我需要返回:
 bob

我无法更改原始函数(我正在处理一个包含数千个函数的大型项目等)。

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

有没有其他的想法?这不是必须要有的,但基本上可以帮助调试。


4
如果一个匿名函数有名称,那它还算是匿名函数吗? - Matt Burland
1
我不确定你要解决什么问题。但是,如果你需要一个标识符,你不能简单地添加一个本地变量来标识函数的名称吗? - Harvey A. Ramer
arguments.callee.caller已被弃用。请参考此链接:https://dev59.com/lnVD5IYBdhLWcg3wDXJ3#235760 - Matt Burland
好的,大家谢谢你们的帮助。我一直在寻找一个捷径,但似乎不可能,所以我会做一个冗长的版本。 - Welsh King
好观点 @Matt Burland :) - Welsh King
2个回答

2
如果你尝试做类似这样的事情,会发生什么:
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


我喜欢这样的回答,总有一种“方法”。 - fanfare

0

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

var cache = {};

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

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

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

bob(); //bob

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接