你如何在JavaScript中找到调用函数?
function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
有没有办法找出调用堆栈?
function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
有没有办法找出调用堆栈?
请注意,此解决方案已弃用,根据 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());
}
您可以使用浏览器特定的代码查找整个堆栈跟踪。好消息是有人已经做到了;这是GitHub上的项目代码。
但并非所有的消息都是好消息:
获取堆栈跟踪真的很慢,所以要小心(阅读更多内容)。
您需要定义函数名称,以使堆栈跟踪清晰可辨。因为如果你有这样的代码:
var Klass = function kls() {
this.Hello = function() { alert(printStackTrace().join('\n\n')); };
}
new Klass().Hello();
谷歌浏览器会发出警报,但大多数浏览器会期望在关键字后面有一个函数名称,并将其视为匿名函数。如果您不为函数提供名称,甚至Chrome也无法使用该名称。... kls.Hello ( ...
function
Klass
kls
顺便说一句,你可以将选项传递给函数printStackTrace,但我没有发现这样做有任何真正的改进。{guess: true}
并非所有浏览器都为您提供相同的信息。即参数、代码列等。
顺便说一句,如果您只需要调用方函数的名称(在大多数浏览器中,但不是IE),则可以使用:
arguments.callee.caller.name
但请注意,此名称将是关键字后面的名称。我发现没有办法(即使在Google Chrome上)在没有获得整个函数的代码的情况下获得更多。function
并总结了其余最好的答案(由Pablo Cabrera,nourdine和Greg Hewgill撰写)。唯一可以使用的跨浏览器和真正安全的东西是:
arguments.callee.caller.toString();
这将显示调用方函数的代码。可悲的是,这对我来说还不够,这就是为什么我给你StackTrace和调用函数Name的提示(尽管它们不是跨浏览器的)。