Function.prototype.arguments

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。

注意: Function 对象的 arguments 属性已弃用。访问 arguments 对象的推荐方式是引用函数内可用的 arguments 变量。

arguments 属性是 Function 实例的一个访问器属性,它返回传递给该函数的参数。对于 严格模式、箭头函数、异步函数和生成器函数,访问 arguments 属性会抛出 TypeError

描述

arguments 的值是一个类数组对象,对应于传递给函数的参数。

在递归的情况下,即如果函数 `f` 在调用栈中出现多次,`f.arguments` 的值表示函数最近一次调用的对应参数。

当函数没有正在进行的调用时(即函数已被调用但尚未返回),arguments 属性的值通常为 null

请注意,ECMAScript 规范中唯一指定的行为是 Function.prototype 具有一个初始的 arguments 访问器,它会无条件地为任何 getset 请求抛出 TypeError(称为“毒丸访问器”),并且实现不允许更改此语义,除非是非严格的普通函数。arguments 属性的实际行为(如果不是抛出错误)是由实现定义的。例如,Chrome 将其定义为自有数据属性,而 Firefox 和 Safari 则扩展了初始的毒丸 Function.prototype.arguments 访问器,以特殊处理非严格函数作为 `this` 值。

js
(function f() {
  if (Object.hasOwn(f, "arguments")) {
    console.log(
      "arguments is an own property with descriptor",
      Object.getOwnPropertyDescriptor(f, "arguments"),
    );
  } else {
    console.log(
      "f doesn't have an own property named arguments. Trying to get f.[[Prototype]].arguments",
    );
    console.log(
      Object.getOwnPropertyDescriptor(
        Object.getPrototypeOf(f),
        "arguments",
      ).get.call(f),
    );
  }
})();

// In Chrome:
// arguments is an own property with descriptor {value: Arguments(0), writable: false, enumerable: false, configurable: false}

// In Firefox:
// f doesn't have an own property named arguments. Trying to get f.[[Prototype]].arguments
// Arguments { … }

示例

使用 arguments 属性

js
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}`);

// Logs:
// before: 1
// before: 0
// after: 0
// after: 1
// returned: null

规范

不属于任何标准。

浏览器兼容性

另见