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

2022-08-29 22:10:32
function main()
{
   Hello();
}

function Hello()
{
  // How do you find out the caller function is 'main'?
}

有没有办法找出调用堆栈?


答案 1

请注意,此解决方案已弃用,根据 MDN 文档,不应再使用此解决方案

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller


function Hello()
{
    alert("caller is " + Hello.caller);
}

请注意,此功能是非标准的,来自 Function.caller

非标准
此功能是非标准的,不在标准轨道上。不要在面向 Web 的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,并且行为将来可能会更改。


以下是2008年的旧答案,现代Javascript不再支持它:

function Hello()
{
    alert("caller is " + arguments.callee.caller.toString());
}

答案 2

堆栈跟踪

您可以使用浏览器特定的代码查找整个堆栈跟踪。好消息是有人已经做到了;这是GitHub上的项目代码

但并非所有的消息都是好消息:

  1. 获取堆栈跟踪真的很慢,所以要小心(阅读更多内容)。

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

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

    谷歌浏览器会发出警报,但大多数浏览器会期望在关键字后面有一个函数名称,并将其视为匿名函数。如果您不为函数提供名称,甚至Chrome也无法使用该名称。... kls.Hello ( ...functionKlasskls

    顺便说一句,你可以将选项传递给函数printStackTrace,但我没有发现这样做有任何真正的改进。{guess: true}

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


调用方函数名称

顺便说一句,如果您只需要调用方函数的名称(在大多数浏览器中,但不是IE),则可以使用:

arguments.callee.caller.name

但请注意,此名称将是关键字后面的名称。我发现没有办法(即使在Google Chrome上)在没有获得整个函数的代码的情况下获得更多。function


调用方函数代码

并总结了其余最好的答案(由Pablo Cabrera,nourdine和Greg Hewgill撰写)。唯一可以使用的跨浏览器和真正安全的东西是:

arguments.callee.caller.toString();

这将显示调用方函数的代码。可悲的是,这对我来说还不够,这就是为什么我给你StackTrace和调用函数Name的提示(尽管它们不是跨浏览器的)。