3

我在这里阅读了有关如何使用堆栈溢出的大量帖子

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

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

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

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

总而言之,我制作了一个新应用程序,然后调用app.testFunction. testFunction()电话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...

    };
};
4

1 回答 1

3

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

// Declaration
function nameIsHere() {
}

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

(请注意,如果您使用命名函数表达式,IE8 和更早版本会创建两个单独的函数。)

arguments.callee在对该函数的调用中、在支持它的引擎上以及如果您没有使用严格模式时,可以为您提供对该函数对象的引用。请注意,它会对性能产生重大影响(在某些引擎上是一个数量级),并且在严格模式下是不允许的。

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

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

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

于 2012-12-28T23:23:03.730 回答