考虑以下示例。
var obj = function(){};
function apply(target, obj) {
if (target && obj && typeof obj == "object") {
for (var prop in obj) {
target[prop] = obj[prop];
}
}
return target;
}
apply(obj.prototype, {
firstFunction: function (){
this.secondFunction();
},
secondFunction: function (){
// how do I know what function called me here?
console.log("Callee Name: '" + arguments.callee.name + "'");
console.log("Caller Name: '" + arguments.callee.caller.name + "'");
}
});
var instance = new obj();
instance.firstFunction();
更新
两个答案都很棒。谢谢你。然后我研究了在对象中调用递归函数或父函数的问题,并在此处找到了解决方案。这将允许我在不使用 arguments.callee/caller 属性的情况下检索函数名称。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function
最佳答案
函数的名称 是该函数的不可变属性,在初始函数表达式中设置。
var notTheName = function thisIsTheName() { ... }
someObj.stillNotTheName = function stillTheName() { ... }
如果您的函数表达式没有名称,则(不出所料)无法通过名称来识别它。将函数分配给变量并没有给它一个名字;如果是这种情况,您将无法确定分配给多个变量的表达式的名称。
您应该设置 firstFunction
的 name
属性,将其表示为
firstFunction: function firstFunction(){
this.secondFunction();
}
此外,arguments.callee
已弃用。参见 Why was the arguments.callee.caller property deprecated in JavaScript?对于 arguments.callee
的历史有很好的解释。
关于javascript - 如何在 Javascript 中获取调用函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412815/