我已经阅读了有关如何使用
的堆栈溢出的大量帖子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...
};
};
答案 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中也没有标准化,而且你的功能也没有名字。