Function.prototype.arguments
非推奨;: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
非標準: この機能は標準化されていません。非標準の機能はブラウザーの対応が限られ、将来的に変更または削除される可能性があるため、本番環境での使用は推奨されません。ただし、標準の選択肢が存在しない特定のケースでは、有効な代替手段となる場合があります。
メモ: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
アクセサーを拡張し、非厳格関数であるこれらの値を特別に処理しています。
(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 オブジェクトの使用
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
仕様書
どの標準にもありません。