无法获取函数调用者名称(arguments.callee.caller无法正常工作)

时间:2012-12-28 23:21:01

标签: javascript

我已经阅读了有关如何使用

的堆栈溢出的大量帖子
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...

    };
};

1 个答案:

答案 0 :(得分:3)

示例中的所有函数都没有名称。他们都是匿名的。您为其指定的变量和/或属性具有名称,但功能却没有。对于具有真实姓名的函数,在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没有在规范中指定的行为,但在所有主要的桌面浏览器上,它为您提供了函数源代码的一些表示。 (移动和小众浏览器不一定如此。)但请注意,这是非标准的,并且因浏览器而异(例如,有些人会逐字逐字地返回源代码,包括注释;其他人返回反编译的表示形式)他们编译的功能)。

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