ReferenceError: 已弃用的 caller 或 arguments 用法

当已弃用的 arguments.calleeFunction.prototype.callerFunction.prototype.arguments 属性被使用时,会发生 JavaScript 严格模式 唯一的异常 "'caller'、'callee' 和 'arguments' 属性不能在严格模式函数或对它们的调用的参数对象上访问"。

消息

TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them (V8-based & Firefox)
TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context. (Safari)

错误类型

TypeError 仅在 严格模式 中。

哪里出错了?

严格模式 中,使用了 arguments.calleeFunction.prototype.callerFunction.prototype.arguments 属性,但不应该使用。它们已被弃用,因为它们泄漏函数调用者,是非标准的,难以优化,并且可能是一个对性能有害的特性。

示例

已弃用的 function.caller 或 arguments.callee

Function.prototype.callerarguments.callee 已弃用(有关更多信息,请参阅参考文章)。

js
"use strict";

function myFunc() {
  if (myFunc.caller === null) {
    return "The function was called from the top!";
  } else {
    return `This function's caller was ${myFunc.caller}`;
  }
}

myFunc();
// TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

Function.prototype.arguments

Function.prototype.arguments 已弃用(有关更多信息,请参阅参考文章)。

js
"use strict";

function f(n) {
  g(n - 1);
}

function g(n) {
  console.log(`before: ${g.arguments[0]}`);
  if (n > 0) {
    f(n);
  }
  console.log(`after: ${g.arguments[0]}`);
}

f(2);

console.log(`returned: ${g.arguments}`);
// TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

另请参阅