すべての Javascript 関数は、独自のスコープ内の特別な変数 (引数) にアクセスできます。この変数には、関数に渡されるすべての引数のリストが含まれています。
引数オブジェクトは配列ではありません。構文的には配列と同じ機能を持ちますが、たとえば長さのプロパティがあります。しかし、これは Array.prototype を継承するものではなく、実際にはオブジェクトです。
したがって、プッシュ、ポップ、スライスなどの一部の配列メソッドを引数に直接使用することはできません。 したがって、これらのメソッドを使用するには、それを実数の配列に変換する必要があります。
配列に変換
次のコードは、引数オブジェクトのすべての要素を含む配列を返します。
Array.prototype.slice.call(arguments);
変換は非常に遅いため、パフォーマンスが重要なプログラムではお勧めできません。
パラメータを渡す
次は、ある関数から別の関数に引数オブジェクトを渡すための推奨される方法です。
もう 1 つの賢い方法は、call と apply を同時に使用して、バインドされていない外部メソッドをすばやく作成することです。
関数のパラメータと引数の属性の関係
arguments オブジェクトは、独自のプロパティとその関数の仮パラメータの両方に対して getter メソッドと setter メソッドを作成します。
したがって、関数の仮パラメータを変更すると、対応する引数オブジェクトのプロパティ値に影響し、その逆も同様です。
パフォーマンスの問題
引数が作成されないのは 2 つの状況のみです。1 つは関数内のローカル変数として宣言され、もう 1 つは関数の仮パラメーターとして使用されます。それ以外の場合は、引数オブジェクトが常に作成されます。
getter メソッドと setter メソッドは常に引数オブジェクトを使用して作成されるため、引数の使用自体はパフォーマンスにほとんど影響を与えません。
ただし、JavaScript のパフォーマンスに重大な影響を与える状況が 1 つあります。それは、arguments.callee の使用です。
上記のコードでは、foo 関数はそれ自体とその呼び出し元の両方を認識する必要があるため、単純なインライン拡張機能ではなくなりました。これは、インライン展開によってもたらされるパフォーマンスの向上を無効にするだけでなく、関数自体が特定の呼び出しコンテキストに依存する必要がある可能性があるため、関数のカプセル化も破壊します。
したがって、arguments.callee は使用しないことをお勧めします。
上記はすべて Javascript の引数オブジェクトについての説明です。簡単に言えば、
引数は関数のパラメータ オブジェクトを指します (渡される実際のパラメータを指します)
argument.length は、関数
のパラメーター オブジェクトの長さを指します。
argument[i] は、i 番目のパラメータの値を指します (最初のパラメータは 0)