📅  最后修改于: 2023-12-03 14:51:55.919000             🧑  作者: Mango
在 JavaScript 中,有时我们需要获取当前正在运行的函数名称,这在调试和日志记录中非常有用。下面是几种方法来实现这个功能。
arguments.callee 指向当前正在执行的函数,因此可以使用它来获取当前函数的名称。然而,由于严格模式下禁用了 arguments.callee,这种方法已经失效。
function getCurrentFunctionName() {
return arguments.callee.name;
}
console.log(getCurrentFunctionName()); // 输出:getCurrentFunctionName
在函数中,可以使用函数名属性来获取函数名称。但是在函数外,这种方法无法工作。
function getCurrentFunctionName() {
return getCurrentFunctionName.name;
}
console.log(getCurrentFunctionName()); // 输出:getCurrentFunctionName
使用 Error 对象的 stack 属性来获取正在执行的函数的名称。这个方法可以在严格模式下和非严格模式下都工作。
function getCurrentFunctionName() {
try {
throw new Error();
} catch (e) {
return e.stack.match(/function\s+([^(]+)\(/)[1];
}
}
console.log(getCurrentFunctionName()); // 输出:getCurrentFunctionName
这里抛出了一个错误,然后通过Error对象的stack属性来捕获错误栈。match() 方法使用正则表达式匹配正在运行的函数名称。
在这个方法中,我们也可以将该方法封装起来以便在程序的其他地方无需重复编写相同的代码。
// 实现函数 getFunctionName
function getFunctionName() {
try {
throw new Error();
} catch (e) {
return e.stack.match(/function\s+([^(]+)\(/)[1];
}
}
// 使用示例
function foo() {
console.log(getFunctionName());
}
console.log(getFunctionName()); // 输出:getFunctionName
foo(); // 输出:foo
总结
我们可以使用 arguments.callee.name、函数名属性和 Error 对象的 stack 属性来获取当前运行的函数名称。虽然第一种方法在严格模式下失效,但是使用函数名属性和 Error 对象方法可以解决这个问题。同时,Error 对象方法可以在严格和非严格模式下都工作。