您可以通过使用 arguments.callee 以编程方式从函数内部识别函数的任何属性,甚至是未命名的匿名函数。所以你可以用这个简单的技巧来识别函数:
每当您创建一个函数时,请为其分配一些属性,以便以后识别它。
例如,总是创建一个名为 id 的属性:
var fubar = function() {
this.id = "fubar";
//the stuff the function normally does, here
console.log(arguments.callee.id);
}
arguments.callee 本身就是函数,因此该函数的任何属性都可以像上面的 id 一样访问,甚至是您自己分配的属性。
Callee 已被官方弃用,但仍然适用于几乎所有浏览器,并且在某些情况下仍然没有替代品。您只是不能在“严格模式”下使用它。
当然,您也可以命名匿名函数,例如:
var fubar = function foobar() {
//the stuff the function normally does, here
console.log(arguments.callee.name);
}
但这显然不那么优雅,因为(在这种情况下)你不能在两个地方都将它命名为 fubar。我必须将实际名称设为 foobar。
如果您的所有函数都有描述它们的注释,您甚至可以抓住它,如下所示:
var fubar = function() {
/*
fubar is effed up beyond all recognition
this returns some value or other that is described here
*/
//the stuff the function normally does, here
console.log(arguments.callee.toString().substr(0, 128);
}
请注意,您还可以使用 argument.callee.caller 来访问调用当前函数的函数。这使您可以从外部访问函数的名称(或属性,如 id 或文本中的注释)。
你这样做的原因是你想找出什么叫做有问题的函数。首先,这可能是您希望以编程方式查找此信息的原因。
因此,如果上面的 fubar() 示例之一调用了以下函数:
var kludge = function() {
console.log(arguments.callee.caller.id); // return "fubar" with the first version above
console.log(arguments.callee.caller.name); // return "foobar" in the second version above
console.log(arguments.callee.caller.toString().substr(0, 128);
/* that last one would return the first 128 characters in the third example,
which would happen to include the name in the comment.
Obviously, this is to be used only in a desperate case,
as it doesn't give you a concise value you can count on using)
*/
}