Strict Mode和ESLint规范都禁止使用arguments.callee,原因参见:Strict modearguments.callee。但在设计日志系统和日志格式时,却需要记录日志信息所在函数或方法。简单粗暴的方式便是直接hard coding,将函数、方法名copy到日志数据中,如此产生的问题便是一旦函数、方法名变更,便需要同步修改日志。对于一名有原则的程序猿来说,如何能忍?

于是,尝试动态获取函数、方法名,自然而然想到的便是函数的.name属性,但.name的访问首先需要通过函数、方法对象,因此又重复上述提到的问题。联想到arguments对象的caller和callee对象,觉得通过callee访问可行,代码统一,又能避免同步修改的问题,可谓“完美”。

但,无法通过ESLint校验如何解决?ESLint提示:Avoid arguments.callee. (no-caller)。此时,便可通过ES6的解构赋值搞定:

javascriptCopy code
  • 1
const {callee} = arguments;
const {callee} = arguments;

再次“完美”。

但,虽然解决了以上种种问题,却又有……“arguments.callee is no longer supported”。然并卵……

因此,还是回归简单粗暴方式,并通过err.stack弥补吧……