返回

严格模式下获取 JavaScript 函数调用者的替代方案

javascript

## 在严格模式下访问 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 对象。

## 结论

在严格模式下访问函数调用者是一个常见的痛点,但有替代解决方案可用。通过了解这些替代方案及其优缺点,你可以选择最适合你特定需求的解决方案。

## 常见问题解答

  1. 为什么 caller 函数在严格模式下被弃用?
    它会泄露内部函数调用信息,从而对应用程序的安全性构成威胁。
  2. 哪种替代方案最可靠?
    堆栈跟踪最可靠,但可能在某些环境中不可用。
  3. arguments.callee 是否仍然可用?
    是的,但它已弃用,不推荐使用。
  4. 是否有第三方库可以帮助获取函数调用者?
    是的,例如 debug 库。
  5. 这些替代方案是否适用于箭头函数?
    堆栈跟踪适用于箭头函数,但 arguments.callee 不适用于箭头函数。