如何在严格模式下获取函数名[正确方法]

7
arguments.callee 不幸已经被弃用,在"严格模式"下使用它会抛出错误。
是否有新的适当(标准)的替代方法来获取实际函数中的函数名?或者在将来的ECMA6、ECMA7计划中会有吗?
最近的答案只是一种不可接受的脏方式。 arguments.callee.caller.name也无法工作(nodejs v7.5.0)。

2
可能是在严格模式下获取当前函数名称的重复问题。 - Jim Deville
2
我已经提到过了。为每个调用创建错误对象只是一种hack方法,而不是一种有效的方法。 - Firanolfind
2
黑客还是不是,那仍然是我所知道的最好的。你为什么需要函数名? - Jim Deville
2
如果你正在包装一个函数,难道不能在被包装的函数上使用.name吗?例子很重要。 - loganfsmyth
2
那么答案就是没有,这就是为什么我要求澄清。你只能获取你拥有引用的函数的名称,并且不能获取调用堆栈中任意函数的引用。如果你试图详细说明你正在构建的基本解决方案,我们可能能够提供建议。 - loganfsmyth
显示剩余8条评论
2个回答

1

有没有新的适合在实际函数内获取函数名称的标准替代方法?

没有。

或者将来的 ES 计划中是否会有这个功能?

不会,因为没有必要。在当前函数内部,您知道名称并且可以使用字符串字面量,而在其他函数中,您只需要一些引用(但不是.callee)。


2
但是有没有办法获取方法名称?对于动态方法来说,这非常有用。 - Firanolfind
@Firanolfind 我不知道你的意思。如果是动态的,你已经通过名称访问它了,对吧?你可能需要发布一个新问题,在那里你可以用代码说明你的实际问题。 - Bergi
2
这不是完全“正确”的方法,所以我不会将其发布为答案,但它可能足够用于调试。在函数内调用callees()[0]以获取其名称。我只对它进行了一些基本测试:function callees(){return(new Error())。stack.split(/ \ n /)。slice(2)。map(s => s.replace(/ ^ \ s + at \ s +(\ <?[\w.]+\>?)。* /,'$ 1'))} - omninonsense
2
如果我想在10个函数中添加 console.debug(current function name) ,在每个函数内放置实际名称是令人讨厌且容易出错的。复制并粘贴 console.debug(arguments.callee) 更方便(我不需要重复函数名称)。顺便说一下,我正在使用Visual Studio Code,并且还没有使用JavaScript的自动重构工具。您能推荐一些吗? - Michael Freidgeim
1
Console.trace太冗长了,会产生多行输出,而我只需要函数名。记录日志和调试有不同的用途,通常记录日志在时间上更具生产力(https://dev59.com/lXRB5IYBdhLWcg3wc280#14498099)。 - Michael Freidgeim
显示剩余3条评论

0
如果您使用Node.js,那么有一个非常有用的软件包可以解决这个问题:caller-id
var callerId = require('caller-id');

function foo() {
    bar();
}

function bar() {
    var callerName = callerId.getData().functionName; /* 'foo' */
}

2
鉴于他们要求“新的适当(标准)替代方案”,这似乎实际上并没有回答问题。 - loganfsmyth
看起来不错。有没有计划为Node.js制定模块标准? - Firanolfind
这是你之前得到的相同答案,只是用一个漂亮的模块包装起来,并使用一些特定于V8的API。 - loganfsmyth
3
"caller-id" 加载了大量的软件包。 - Firanolfind

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