私は成功せずに次のことを試しました:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
関数aでは、argumentsキーワードを使用して引数の配列にアクセスできますが、関数bではこれらは失われます。私がやろうとしているような別のJavaScript関数に引数を渡す方法はありますか?
私は成功せずに次のことを試しました:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
関数aでは、argumentsキーワードを使用して引数の配列にアクセスできますが、関数bではこれらは失われます。私がやろうとしているような別のJavaScript関数に引数を渡す方法はありますか?
回答:
次のよう.apply()
にarguments
、function b
で同じアクセス権を使用します。
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
apply
、このように使用するとb
(たとえば、オブジェクトの内部関数である場合)
スプレッド演算子を使用すると、複数の引数(関数呼び出しの場合)または複数の要素(配列リテラルの場合)が予想される場所で式を展開できます。
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をまだ使用している場合、このスニペットは構文エラーを返します。
編集者注:スニペットではを使用しているため、結果を表示するにはブラウザのJSコンソールを開くconsole.log()
必要があります - ページはめ込み結果はありません。
この結果が表示されます:
つまり、配列を使用している場合、spread演算子はさまざまな目的に使用できるため、関数の引数にも使用できます。公式ドキュメントで説明されている同様の例を見ることができます:Restパラメーター
...args
には必要ありませんa
。あなただけの引数なしで機能させるとする上でそれらを渡すことができb
て...arguments
...args
として明示的に指定するa
ことが重要になります。
他の回答のどれも提供しないという説明は、元の引数はまだ利用可能ですが、arguments
オブジェクトの元の位置にはありません。
arguments
オブジェクトは、関数に提供される各実際のパラメータに対して1つの元素を含みます。あなたが呼び出すとa
数字:あなたは3つの引数を供給し1
、2
、、と3
。したがって、arguments
が含まれています[1, 2, 3]
。
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
b
ただし、を呼び出すときは、引数を1つだけ渡します:a
のarguments
オブジェクト。つまり、arguments
が含まれます[[1, 2, 3]]
(つまり、a
の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
、一般的なケースでは正しい解決策です。
this
にapply
?
これを試して
function global_func(...args){
for(let i of args){
console.log(i)
}
}
global_func('task_name', 'action', [{x: 'x'},{x: 'x'}], {x: 'x'}, ['x1','x2'], 1, null, undefined, false, true)
//task_name
//action
//(2) [{...},
// {...}]
// {
// x:"x"
// }
//(2) [
// "x1",
// "x2"
// ]
//1
//null
//undefined
//false
//true
//func
arguments
は実際には配列ではなく(むしろ、配列のようなセマンティクスを実装するオブジェクト)、したがって、実際の配列と同じように使用できるかどうかは、一見すると完全に明確ではありません。