如何从该函数中获取函数名称?

2022-08-29 23:56:20

如何从该函数内部访问函数名称?

// parasitic inheritance
var ns.parent.child = function() {
  var parent = new ns.parent();
  parent.newFunc = function() {

  }
  return parent;
}

var ns.parent = function() {
  // at this point, i want to know who the child is that called the parent
  // ie
}

var obj = new ns.parent.child();

答案 1

在 ES6 中,您只能使用 .myFunction.name

注意:请注意,某些JS微型器可能会丢弃函数名称,以便更好地压缩;您可能需要调整其设置以避免这种情况。

在ES5中,最好的办法是:

function functionName(fun) {
  var ret = fun.toString();
  ret = ret.substr('function '.length);
  ret = ret.substr(0, ret.indexOf('('));
  return ret;
}

使用是非标准的。 并且在严格模式下都被禁止。Function.callerFunction.callerarguments.callee

编辑:nus下面基于正则表达式的答案实现了同样的事情,但具有更好的性能!


答案 2

ES6(灵感来自以下Sendy Halim的答案):

myFunction.name

关于MDN的解释。截至2015年,可在nodejs和除IE之外的所有主流浏览器中工作。

注意:在绑定函数上,这将给出 “”。如果要获取原始名称,则必须剥离“绑定”。bound <originalName>


ES5(灵感来自弗拉德的答案):

如果您有对该函数的引用,则可以执行以下操作:

function functionName( func )
{
    // Match:
    // - ^          the beginning of the string
    // - function   the word 'function'
    // - \s+        at least some white space
    // - ([\w\$]+)  capture one or more valid JavaScript identifier characters
    // - \s*        optionally followed by white space (in theory there won't be any here,
    //              so if performance is an issue this can be omitted[1]
    // - \(         followed by an opening brace
    //
    var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )

    return  result  ?  result[ 1 ]  :  '' // for an anonymous function there won't be a match
}
  • 我没有对此进行单元测试,也没有验证实现差异,但原则上它应该有效,如果没有留下评论。
  • 注意:不适用于绑定函数
  • 注意:和 被视为已弃用。callercallee

[1]我在这里包含它是因为它是合法的,并且经常有足够的语法突出显示工具无法考虑函数名称和括号之间的空格。另一方面,我不知道.toString()的任何实现将包含空格,所以这就是为什么你可以省略它。


作为原始问题的答案,我会放弃寄生继承,而选择一些更传统的OOP设计模式。我写了一个TidBits.OoJs来舒适地用JavaScript编写OOP代码,其功能集模仿C++(尚未完成,但大多数)。

我从评论中看到,您希望避免将信息需求传递给它的构造函数。我必须承认,传统的设计模式并不能使你免于这种模式,因为通常认为让你的依赖关系变得明显并强制执行是一件好事。parent

我还建议远离匿名函数。它们只使调试和分析PITA,因为所有内容都显示为“匿名函数”,并且据我所知,它们没有任何好处。