如何在JavaScript函数内获取函数名称?

35

如何学习当前函数的名称?

以下代码会弹出'Object'。但我需要知道如何弹出"Outer."。

function Outer(){

    alert(typeof this);

}

我很好奇,在什么情况下,你所在的函数名称实际上不是代码中写出来的那个名称? - bryantsai
@bryantsai:window[window.prompt('函数名称:', '')] = function(){ alert(arguments.callee.name); }; - Boldewyn
可能是Can I get the name of the currently running function in JavaScript?的重复问题。 - Michael Freidgeim
4个回答

34

这样做是可行的:

function test() {
  var z = arguments.callee.name;
  console.log(z);
}

24

我认为你可以这样做:

var name = arguments.callee.toString();

如果想了解更多信息,请查看这篇文章

function callTaker(a,b,c,d,e){
  // arguments properties
  console.log(arguments);
  console.log(arguments.length);
  console.log(arguments.callee);
  console.log(arguments[1]);
  // Function properties
 console.log(callTaker.length);
  console.log(callTaker.caller);
  console.log(arguments.callee.caller);
  console.log(arguments.callee.caller.caller);
  console.log(callTaker.name);
  console.log(callTaker.constructor);
}

function callMaker(){
  callTaker("foo","bar",this,document);
}

function init(){
  callMaker();
}

3
很不幸,“arguments.callee”已被弃用,但由于ECMA尚未定义任何替代方法,这仍然是可行的方式。 - Boldewyn
@boldewyn:在更多的搜索之后,我也看到了这一点。虽然它已经被弃用了,但它仍然可以在大多数浏览器中使用。就像你所说的,没有替代方案,所以......^^ - marcgg
1
@Boldewyn,arguments.callee不仅已被弃用。当启用严格模式时,访问它会导致TypeError。 - bryantsai
4
我不确定 arguments.callee 是否已被弃用,但 Function.arguments 和 Function.arguments.callee 已经被弃用了,而函数参数中的 callee 属性并没有被弃用。根据 MDC 的说法: JavaScript 1.4 版本已将 callee 作为 Function.arguments 的属性弃用,但它仍然是函数本地参数变量的属性。 - meouw

10

从ES6开始,你可以使用Function.prototype.name。这样做的好处是它可以与箭头函数一起使用,因为它们没有自己的arguments对象。

function logFuncName() {
  console.log(logFuncName.name);
}

const logFuncName2 = () => {
  console.log(logFuncName2.name);
};

13
不想使用函数自身的名称怎么办?可以使用类似于“this.name”的形式,其中“this”表示“该函数”,而不是“该类”。请问需要翻译其他内容吗? - Ran Lottem
1
他们应该把它做成像 function.name 或者 [this.function].name 这样的形式。 - Eagle_

2

花了我一段时间才想明白这个问题,因此我尝试让它对像我这样的新手更加清晰易懂。

方法1 - arguments.callee.name

这种方法以前可以使用,但是在ES6严格模式下将失败。 不要使用方法1。

//approach 1 - don't use
let functionName = arguments.callee.name;
console.log(functionName);

方法二 - 创建一个函数并使用caller.name

这种方法在最新版本的JavaScript中有效,并且不会在严格模式下失败。请使用方法二,包括两个步骤:

第一步 - 创建一个函数,使用caller.name返回调用它的函数的名称。将此函数添加到您的代码中:

function getFuncName() {
   return getFuncName.caller.name
}

第二步 - 当您需要获取代码当前所在函数的名称时,请调用您的函数。
    function iWantThisName() { 
      console.log(getFuncName())
    }
    
    iWantThisName() 
    // Logs: "iWantThisName"

1
根据官方文档,caller.name和callee.name已经被弃用。 - SDK4551
@SDK4551 :( 谢谢。你知道其他替代方案吗? - Joshua Dance
错误堆栈可用于获取相同的信息。 - SDK4551
1
错误 TypeError: 'caller'、'callee' 和 'arguments' 属性不能在严格模式函数或调用它们的参数对象上访问出了什么问题?请参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Deprecated_caller_or_arguments_usage - LeMoussel

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