打印函数名称IIFE的私有方法

时间:2016-10-14 22:05:16

标签: javascript meteor

此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');
    }

  }

}());

2 个答案:

答案 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。它不是标准的,您可以参考该功能:

&#13;
&#13;
(function() {
  const printFuncName = (str) => {
    const info = str ? ' ' + str + ' ' : ' ';
    console.log(printFuncName.caller.name + info); // "myPub info " (maybe)
  };
  return {
    myPub() {
      printFuncName('info');
    }
  }
}()).myPub();
&#13;
&#13;
&#13;

请注意caller也不是标准。你不应该使用它。不要依赖它。它将以严格模式投入。可能无法在草率模式下工作。