このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Function.prototype.arguments

非推奨

この機能を新しいプロジェクトで使用することは避けてください。 JavaScript strict mode prohibits accessing the caller and arguments properties of a Function object. この機能は、ウェブ標準やブラウザーから除去される可能性があります。

非標準: この機能は標準化されていません。非標準の機能はブラウザーの対応が限られ、将来的に変更または削除される可能性があるため、本番環境での使用は推奨されません。ただし、標準の選択肢が存在しない特定のケースでは、有効な代替手段となる場合があります。

メモ: Function オブジェクトの arguments プロパティは非推奨です。arguments オブジェクトにアクセスするには、関数内で利用できる変数 arguments を参照することを推奨します。

arguments は Function インスタンスのアクセサープロパティで、その関数に渡された引数を返します。厳格モードの関数、アロー関数、非同期関数、ジェネレーター関数では、arguments プロパティにアクセスすると TypeError が発生します。

解説

arguments の値は、関数に渡した引数に対応する配列風のオブジェクトです。

再帰呼び出しの場合、すなわちコールスタックに関数 f が複数回現れる場合に、f.arguments はもっとも直近に実行された関数に対応する引数を表します。

関数の呼び出しが完了し、実行中の呼び出しがない場合、arguments プロパティの値は通常 null です。

ECMAScript 仕様で規定されているのは、Function.prototype が初期 arguments アクセサーを持ち、get または set の要求に対して無条件に 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),
    );
  }
})();

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

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

// ログ出力:
// before: 1
// before: 0
// after: 0
// after: 1
// returned: null

仕様書

どの標準にもありません。

ブラウザーの互換性

関連情報