以下のことを試してみましたが、うまくいきませんでした。
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
関数aではargumentsキーワードを使って引数の配列にアクセスできますが、関数bではこれらが失われてしまいます。私がやろうとしているように、別のjavascript関数に引数を渡す方法はありますか?
.apply()][1]を使うと、以下のように、関数
bの
arguments`にも同じようにアクセスできます。
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
[ここでテストできます][2]。
スプレッド演算子は、複数の引数(関数呼び出しの場合)や複数の要素(配列リテラルの場合)が想定される場所で、式を展開することができます。
ECMAScript ES6 では、より実用的な方法でこれを行うことができる新しい演算子が追加されました。...拡張演算子。
apply`メソッドを使わない例。
function a(...args){
b(...args);
b(6, ...args, 8) // You can even add more elements
}
function b(){
console.log(arguments)
}
a(1, 2, 3)
Note このスニペットは、お使いのブラウザがまだES5を使用している場合、シンタックスエラーを返します。
編集部注:このスニペットはconsole.log()
を使用しているため、結果を見るためにはブラウザのJSコンソールを開く必要があります** - ページ内での結果はありません
このような結果が表示されます。
要するに、スプレッド演算子は、配列を使っている場合には別の目的で使うことができるので、関数の引数にも使うことができます。同様の例が公式ドキュメントで説明されています。一休パラメータ
他のどの回答も提供していない説明は、元の引数は*まだ利用可能ですが、arguments
オブジェクトの元の位置にはありません。
argumentsオブジェクトは、関数に提供される実際のパラメータごとに1つの要素を含みます。a
を呼び出すときには、3つの引数、すなわち、数字の1
、2
、3
を与えます。つまり、arguments
には[1, 2, 3]
が含まれます。
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
しかし、b
を呼び出すときには、a
'の arguments
オブジェクトという、正確に 1 つの 引数を渡します。つまり、arguments
には [[1, 2, 3]]
(つまり、a
's arguments
オブジェクトという1つの要素があり、a
に対するオリジナルの引数を含むプロパティを持っています)が含まれていることになります。
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
@Nick さんが実演してくれたように、apply
を使って、コールの中で arguments
オブジェクトのセットを提供することができます。
以下は同じ結果を得るためのものです。
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
しかし、一般的なケースでは apply
が正しい解となります。