协慌网

登录 贡献 社区

你如何在 JavaScript 中找到调用函数?

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 上项目代码

但并非所有新闻都是好的:

  1. 获取堆栈跟踪非常慢,所以要小心(请阅读此内容以获取更多信息)。

  2. 您需要将堆栈跟踪的函数名称定义为清晰。因为如果您有这样的代码:

    var Klass = function kls() {
       this.Hello = function() { alert(printStackTrace().join('\n\n')); };
    }
    new Klass().Hello();

    谷歌浏览器会提醒... kls.Hello ( ...但是大多数浏览器都希望在关键字function之后使用一个功能名称,并将其视为匿名功能。如果您使用 Chrome,则无法使用Klass名称不要给名字kls这个函数。

    顺便说一下,你可以将函数 printStackTrace 传递给函数{guess: true}但是我没有找到任何真正的改进。

  3. 并非所有浏览器都提供相同的信息。即参数,代码列等。


来电者功能名称

顺便说一句,如果您只想要调用函数的名称(在大多数浏览器中,但不是 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

注意:它会导致递归函数无限循环。