此Meteor服务器代码具有printFuncName
作为IIFE的私有方法。当从公共方法调用它时,它会给出错误:
TypeError:无法读取属性' name'为null
为什么要这样做?如何修复它以便打印调用from的函数名称?感谢
funcObj = (function() {
const printFuncName = (str) => {
const info = str ? ' ' + str + ' ' : ' ';
console.log(arguments.callee.caller.name + info); //<---- Error line
};
return {
myPub: () => {
printFunctionName('info');
}
}
}());
答案 0 :(得分:2)
警告:接下来是黑客攻击。犹太洁食的方式是将名称作为一个传递给该函数。但是,它比arguments.callee
方法更好,所以如果必须,请使用它。
如果您创建了一个Error
对象,则可以检查stack
以获取函数名称链:
new Error().stack.split('\n')
[ 'Error',
' at repl:1:1',
' at sigintHandlersWrap (vm.js:22:35)',
' at sigintHandlersWrap (vm.js:96:12)',
' at ContextifyScript.Script.runInThisContext (vm.js:21:12)',
...]
您的来电者姓名将与该文件和行/列信息一起列在该列表中。请注意,许多JS函数未命名,因此这是有限的。
答案 1 :(得分:0)
假设您想要访问printFuncName
的来电者,问题是它是一个箭头功能,因此没有arguments
绑定。您正在访问IIFE的arguments
。
无论如何,你永远不应该使用arguments.callee
。它不是标准的,您可以参考该功能:
(function() {
const printFuncName = (str) => {
const info = str ? ' ' + str + ' ' : ' ';
console.log(printFuncName.caller.name + info); // "myPub info " (maybe)
};
return {
myPub() {
printFuncName('info');
}
}
}()).myPub();
&#13;
请注意caller
也不是标准。你不应该使用它。不要依赖它。它将以严格模式投入。可能无法在草率模式下工作。