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

// 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();

当前回答

我知道这是一个老问题,但最近我为了调试目的,在尝试装饰一些React组件的方法时,也遇到了一些类似的问题。正如人们所说,争论。调用者和实参。calllee在严格模式下是被禁止的,而在你的React编译中,这可能是默认开启的。你可以禁用它,或者我已经能够想出另一个hack,因为在React中所有的类函数都是命名的,你实际上可以这样做:

Component.prototype.componentWillMount = function componentWillMount() {
    console.log('Callee name: ', this.__proto__.constructor.toString().substr(0,30));
...
}

其他回答

在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;
}

使用函数。调用者是非标准的。函数。调用者和实参。在严格模式下,被调用都是被禁止的。

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

我知道这是一个老问题,但最近我为了调试目的,在尝试装饰一些React组件的方法时,也遇到了一些类似的问题。正如人们所说,争论。调用者和实参。calllee在严格模式下是被禁止的,而在你的React编译中,这可能是默认开启的。你可以禁用它,或者我已经能够想出另一个hack,因为在React中所有的类函数都是命名的,你实际上可以这样做:

Component.prototype.componentWillMount = function componentWillMount() {
    console.log('Callee name: ', this.__proto__.constructor.toString().substr(0,30));
...
}

你可以像这样使用构造函数名:

{your_function}.prototype.constructor.name

这段代码只是返回一个方法的名称。

对于支持Error的浏览器,可以使用这个选项。堆栈(可能不是全部)

function WriteSomeShitOut(){ 
  var a = new Error().stack.match(/at (.*?) /);
  console.log(a[1]);
} 
WriteSomeShitOut();

当然这是针对当前函数的,但你懂的。

在你编程的时候开心地流口水

你不能。根据标准,函数没有名字(尽管mozilla有这样一个属性)——它们只能被赋值给有名字的变量。

还有你的评论:

// access fully qualified name (ie "my.namespace.myFunc")

在函数my.namespace. myfuncc . getfn

你所能做的就是返回一个由new

所以你可以说

var obj = new my.namespace.myFunc();
console.info(obj.constructor); //my.namespace.myFunc