返回
严格模式下获取 JavaScript 函数调用者的替代方案
javascript
2024-03-21 19:06:34
## 在严格模式下访问 JavaScript 中的函数调用者
在 JavaScript 中,caller
函数在严格模式下已弃用,使得开发人员在使用严格模式时无法获取函数调用者。
## 问题与原因
caller
函数用于获取调用当前函数的函数。在 ES5 之前,它在 JavaScript 中广泛使用。然而,在 ES5 中,caller
被标记为已弃用,并且在严格模式下不可用。这是因为 caller
函数会泄露内部函数调用信息,从而对应用程序的安全性构成威胁。
## 替代解决方案
虽然 caller
函数在严格模式下不可用,但有其他替代方案可用于获取函数调用者:
- 堆栈跟踪: 可以通过
Error.stack
属性访问堆栈跟踪。堆栈跟踪包含调用函数的函数的名称和位置。 arguments.callee
(不推荐): 尽管arguments.callee
在严格模式下也已弃用,但它仍然可用,并且可以返回调用当前函数的函数。- 第三方库: 一些第三方库,例如 debug,提供了获取函数调用者的方法。
## 如何选择替代方案?
选择哪种替代方案取决于你的特定用例:
- 堆栈跟踪: 最准确,但可能在某些环境中不可用。
arguments.callee
: 不推荐使用,因为它已弃用。- 第三方库: 方便,但会增加依赖关系。
## 代码示例
堆栈跟踪:
function getCallerName() {
const stackTrace = new Error().stack;
const callerLine = stackTrace.split("\n")[2];
return callerLine.match(/at\s+(.*)\s+\(/)[1];
}
arguments.callee
(不推荐):
function getCallerName() {
return arguments.callee.caller.name;
}
第三方库(debug):
const debug = require('debug')('caller');
function getCallerName() {
return debug.getCallsite().getFunctionName();
}
## 注意事项
请注意,这些替代方案可能在某些情况下不适用于箭头函数。这是因为箭头函数没有自己的 arguments
对象。
## 结论
在严格模式下访问函数调用者是一个常见的痛点,但有替代解决方案可用。通过了解这些替代方案及其优缺点,你可以选择最适合你特定需求的解决方案。
## 常见问题解答
- 为什么
caller
函数在严格模式下被弃用?
它会泄露内部函数调用信息,从而对应用程序的安全性构成威胁。 - 哪种替代方案最可靠?
堆栈跟踪最可靠,但可能在某些环境中不可用。 arguments.callee
是否仍然可用?
是的,但它已弃用,不推荐使用。- 是否有第三方库可以帮助获取函数调用者?
是的,例如 debug 库。 - 这些替代方案是否适用于箭头函数?
堆栈跟踪适用于箭头函数,但arguments.callee
不适用于箭头函数。