【问题标题】:trouble getting function caller name (arguments.callee.caller not working)获取函数调用者名称时遇到问题(arguments.callee.caller 不起作用)
【发布时间】:2014-03-19 03:13:37
【问题描述】:

我在这里阅读了很多关于如何使用堆栈溢出的帖子

arguments.callee.caller or arguments.callee.caller.toString()

如果你做一个简单的搜索,你可以找到一堆关于这个的帖子。

所以,我决定自己试试这个!但是,我想在 javascript 对象中找到函数的名称,但它似乎返回的是函数内部的代码,而不是实际的函数名称。

这里是 jsFiddle:http://jsfiddle.net/4Cp5Z/18/

总而言之,我制作了一个新应用程序,然后致电app.testFunctiontestFunction() 调用 receiver(),我希望 var name 等于 testFunction

app = function() {

    this.testFunction = function() {

        this.receiver();

    };

    this.receiver = function() {

        var name = this.receiver.caller.toString();
        // this.receiver.caller.name outputs nothing...

    };
};

【问题讨论】:

  • 你正在做的事情看起来像是一种非常严重的“代码异味”。您真正想要达到什么目的?
  • 我真的只是想学习如何获取调用我当前函数的函数(或命名函数表达式)的名称。我这样做是为了记录/错误处理的目的。
  • 在那种情况下you should check this out

标签: javascript


【解决方案1】:

您示例中的所有函数都没有名称。他们都是匿名的。您分配给它们的变量和/或属性具有名称,但函数没有。对于具有真实名称的函数,function 关键字和左括号后有一个名称:

// Declaration
function nameIsHere() {
}

// Expression -- but beware of these ("named function expressions"), see below
var f = function nameIsHere() {
};

(注意 IE8 和更早版本的 create two separate functions 如果您使用命名函数表达式。)

arguments.callee 在支持该函数的引擎上以及在您未使用严格模式的情况下,在对该函数的调用中为您提供对该函数对象的引用。请注意,它会带来显着的性能损失(在某些引擎上是一个数量级),并且在严格模式下是不允许的。

arguments.callee.caller 为您提供对调用当前函数的函数的引用(如果您不是在严格模式下)。它没有给你它的名字,而是一个实际的参考。

Function#toString 在规范中没有指定行为,但在所有主要的桌面浏览器上,它为您提供了函数源代码的一些 表示。 (这不一定适用于移动和小众浏览器。)但再次注意,这是非标准的,并且因浏览器而异(例如,有些返回源代码相当逐字,包括 cmets;其他返回反编译表示他们编译的函数)。

有一个非标准的Function#name 属性在许多(但不是全部)引擎中支持,它为您提供函数的真实名称(如果有的话)。但同样,它从未被标准化,甚至在 ES5 中也没有,而且你的函数没有名称。

【讨论】:

  • 我读了这个答案,这一切都非常有帮助。 --然而,在var f = function() { //code here }的情况下,有没有办法从f调用的函数中获取'表达式名称'(在这种情况下是f)?
  • @1__ 不,这样实例化的函数与分配给它的引用的某个随机变量之间没有特殊关系。
  • @1__:正如 Pointy 所说,不,没有语言内的方法可以做到这一点。某些浏览器(Chrome 和 Firebug 的最新版本)中的开发工具足够智能,可以在调用堆栈和断点列表中向您显示它,但这是工具的一个功能,而不是您可以从代码中访问的东西——尤其是因为如果你有foo(obj.bar = delta = function() { ... });怎么办? obj.bar 的“名称”是什么? delta?我们传入的foo 参数的名称是什么? :-)
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多