在Node.js中获取当前执行的函数名称

19

在Node.js中,我正在尝试获取当前执行的函数的名称:

function doSomething(req, res) {
  console.log('Function name: ' + doSomething.name);
}

这个方法很好用,但是我想(如果可能的话)在当前上下文中获取名称。这样,如果以后我重命名了这个方法,就不需要手动更改了。是否有一个通用的对象(类似于'this'),指向正在执行的当前函数/当前上下文?谢谢。


可能是Javascript get Function Name?的重复问题。 - Ian
可以在JavaScript中获取当前正在运行的函数名称吗? - Ian
我不认为这是重复的。似乎所有的例子都需要实际的函数(在这种情况下,我宁愿使用“doSomething.name”)。另一个答案不起作用,因为在严格模式下不允许使用“arguments.callee”。 - titusmagnus
这在严格模式下是不允许的,因为它已被弃用,并且需要函数名称是一个不寻常的请求;很少有一个好的使用案例。您能解释一下获取名称的原因吗? - Ian
8
当然:记录和分析应用程序。 - titusmagnus
显示剩余2条评论
3个回答

4

简短回答: Object.values (this) [0] .name

详细解释:

let myInstanceArray = Object.values(this) 将对象属性枚举为数组

let myInstance = myInstanceArray[0] 获取数组中的第一个,也是唯一一个项目

let myName = myInstance.name 获取该项目的名称。


1
arguments.callee.name是可用的,另一个则不可用。 - Yin
4
注:在“严格模式”下,arguments.callee.name无法使用。 - Zachary Yates
2
被调用者似乎已经过时。 - Kat Lim Ruiz

1
您可以将属性name用作以下方式:
const yourFunction = () => {};

console.log(yourFunction.name);
// output: "yourFunction"

MDN reference


1

我不想重复Ian在“可能重复”的建议中的答案,但除了它们之外,可能值得一提的解决方案是:

您可以使用命名函数表达式,以拥有一个名称,该名称可从函数外部访问,以及一个可从内部访问的名称:

var x = function y() {
    console.log(y);
};

console.log(x);

现在,如果您决定给函数取一个不同的名称,您只需更改x,仍然能够使用y引用该函数。

2
呃,但这样太繁琐了吧!那意味着必须以这种方式实现所有函数。它可能有效,但这真的很令人头痛,特别是对于大型应用程序。 :-/ - titusmagnus
1
@titusmagnus MDN建议如下:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee#Description - Ian
1
Ian,请恕我直言,虽然我尊重MDN的建议,但它们的建议可能只适用于某些应用程序,而不是所有应用程序。对于一些已存在的大型应用程序,这将需要进行重大的重新实现。谢谢你的建议,但我还是算了吧;-) - titusmagnus
1
很遗憾,命名函数在IE(可能只是旧版IE)中会泄漏到外部(非全局)作用域。否则应该没问题。http://kangax.github.io/nfe/ - Ian
1
@Ian,我知道,我知道;-)感谢您的帮助,Ian。 - titusmagnus
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接