我可以在 JavaScript 中获取当前正在运行的函数的名称吗?

IT技术 javascript jquery dojo-1.6
2021-01-26 22:33:05

是否有可能做到这一点:

myfile.js:
function foo() {
    alert(<my-function-name>);
    // pops-up "foo"
    // or even better: "myfile.js : foo"
}

我的堆栈中有 Dojo 和 jQuery 框架,所以如果它们中的任何一个使它更容易,它们都可用。

6个回答

在 ES5 及更高版本中,无法访问该信息。

在旧版本的 JS 中,您可以使用arguments.callee.

不过,您可能需要解析该名称,因为它可能包含一些额外的垃圾。不过,在某些实现中,您可以简单地使用arguments.callee.name.

解析:

function DisplayMyName() 
{
   var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

   alert(myName);
}

来源:Javascript - 获取当前函数名称

@Andrew - 你是对的,我应该说明这一点。这是对我已添加书签的内容的快速复制/粘贴/清理,也是我的疏忽。感谢您将其添加到我的帖子中。
2021-03-17 22:33:05
如果您的方法使用对象字面量而没有实际的方法名称,那么这将无法作为参数工作。callee 就像一个匿名函数,不会携带任何函数名称。您必须确保两次添加该函数名称。看看这个 jsfiddle 示例:jsfiddle.net/ncays但是,另一个问题arguments.callee是在严格模式下是不允许的。
2021-03-24 22:33:05
您可以只argument.callee.name在某些环境中使用适用于 Chrome。
2021-03-24 22:33:05
在 ES5 严格模式下中断。
2021-03-28 22:33:05
哦...这就是为什么人们总是在回复速度上打败我。我没有想到这一点。
2021-03-31 22:33:05

对于非匿名函数

function foo()
{ 
    alert(arguments.callee.name)
}

但是在错误处理程序的情况下,结果将是错误处理程序函数的名称,不是吗?

在 Chrome 中运行良好。比接受的答案要好得多。
2021-03-26 22:33:05
值得牢记:eslint.org/docs/rules/no-caller > “在 JavaScript 的未来版本中不推荐使用,并且在 ECMAScript 5 中在严格模式下禁止使用它们。”
2021-03-31 22:33:05

您需要的一切都很简单。创建函数:

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

之后,无论何时需要,您只需使用:

function foo() { 
  console.log(getFuncName())
}

foo() 
// Logs: "foo"
谢谢,这比解析字符串要优雅得多。
2021-03-12 22:33:05
Chrome 给我一个类型错误,因为调用者不存在属性“名称”。但是,检查表明这有效:function getFuncName() { return getFuncName.name }
2021-03-13 22:33:05
这似乎是最好的答案!
2021-03-22 22:33:05
@TomAnderson 通过您的更改,您现在得到的getFuncName是其调用者的姓名而不是其姓名。
2021-03-27 22:33:05
完美的。那时 JS 没有像 PHP 那样有魔法常量的本机常量......
2021-04-09 22:33:05

根据MDN

警告: ECMAScript (ES5) 第 5 版禁止在严格模式下使用 arguments.callee()。通过给函数表达式一个名称或在函数必须调用自身的地方使用函数声明,避免使用 arguments.callee()。

正如指出的适用只有当你的脚本使用“严格模式”。这主要是出于安全原因,遗憾的是目前没有其他选择。

getMyName下面片段中函数返回调用函数的名称。这是一个 hack 并且依赖于非标准功能:Error.prototype.stack. 请注意,返回的字符串格式Error.prototype.stack在不同引擎中的实现方式不同,因此这可能不适用于所有地方:

function getMyName() {
  var e = new Error('dummy');
  var stack = e.stack
                .split('\n')[2]
                // " at functionName ( ..." => "functionName"
                .replace(/^\s+at\s+(.+?)\s.+/g, '$1' );
                return stack
}

function foo(){
  return getMyName()
}

function bar() {
  return foo()
}

console.log(bar())

关于其他解决方案:arguments.callee 在严格模式下是不允许的Function.prototype.caller非标准的,在严格模式下不允许的

即使对于箭头函数也能完美工作,被低估的答案
2021-03-14 22:33:05
Function.prototype.caller 在严格模式下也是不允许的。
2021-03-20 22:33:05
扩展它以显示函数中的位置并支持匿名函数: .replace(/^\s+at\s(.+?)(?:\s.*:|:)(.*?):(.* ?))?$/g, '$1 ($2:$3)' )
2021-03-27 22:33:05