function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
有没有办法找出调用堆栈?
function Hello()
{
alert("caller is " + Hello.caller);
}
请注意,此功能是非标准的 ,来自Function.caller
:
非标
此功能是非标准功能,不符合标准。不要在面向 Web 的生产站点上使用它:它不适用于每个用户。实现之间可能存在很大的不兼容性,并且行为可能在将来发生变化。
以下是 2008 年的旧答案,现代 Javascript 不再支持:
function Hello()
{
alert("caller is " + arguments.callee.caller.toString());
}
您可以使用特定于浏览器的代码查找整个堆栈跟踪。好事是有人已经做到了 ; 这是GitHub 上的项目代码 。
但并非所有新闻都是好的:
获取堆栈跟踪非常慢,所以要小心(请阅读此内容以获取更多信息)。
您需要将堆栈跟踪的函数名称定义为清晰。因为如果您有这样的代码:
var Klass = function kls() {
this.Hello = function() { alert(printStackTrace().join('\n\n')); };
}
new Klass().Hello();
谷歌浏览器会提醒... kls.Hello ( ...
但是大多数浏览器都希望在关键字function
之后使用一个功能名称,并将其视为匿名功能。如果您使用 Chrome,则无法使用Klass
名称不要给名字kls
这个函数。
顺便说一下,你可以将函数 printStackTrace 传递给函数{guess: true}
但是我没有找到任何真正的改进。
并非所有浏览器都提供相同的信息。即参数,代码列等。
顺便说一句,如果您只想要调用函数的名称(在大多数浏览器中,但不是 IE),您可以使用:
arguments.callee.caller.name
但请注意,此名称将是function
关键字后面的名称。我发现在没有获得整个功能的代码的情况下,没有办法(甚至在谷歌浏览器上)获得更多。
并总结其余的最佳答案(由 Pablo Cabrera,nourdine 和 Greg Hewgill 撰写)。 您可以使用的唯一跨浏览器和非常安全的事情是:
arguments.callee.caller.toString();
这将显示调用者函数的代码 。遗憾的是,这对我来说还不够,这就是为什么我给你提供 StackTrace 和调用函数名称的提示(虽然它们不是跨浏览器)。
您可以获得完整的堆栈跟踪:
arguments.callee.caller
arguments.callee.caller.caller
arguments.callee.caller.caller.caller
直到调用者为null
。
注意:它会导致递归函数无限循环。