回答:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
のMDNドキュメントを参照してくださいFunction.prototype.apply()
。
環境がECMAScript 6をサポートしている場合は、代わりにスプレッド引数を使用できます。
call_me(...args);
配列全体を渡して、関数内で必要に応じて処理しませんか?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
関数の呼び出しです。最後にセミコロンがないだけです。
ES6標準には、まさにそれを行う新しいスプレッドオペレーターが ...
あります。
call_me(...x)
IEを除くすべての主要ブラウザでサポートされています。
スプレッドオペレーターは他の多くの便利なことを行うことができ、リンクされたドキュメントはそれを示すのに非常に優れています。
@KaptajnKoldが答えたように
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
また、call_me関数のすべてのパラメーターを定義する必要もありません。そのまま使えますarguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
これに注意してください
function FollowMouse() {
for(var i=0; i< arguments.length; i++) {
arguments[i].style.top = event.clientY+"px";
arguments[i].style.left = event.clientX+"px";
}
};
// ---------------------------
HTMLページ
<body onmousemove="FollowMouse(d1,d2,d3)">
<p><div id="d1" style="position: absolute;">Follow1</div></p>
<div id="d2" style="position: absolute;"><p>Follow2</p></div>
<div id="d3" style="position: absolute;"><p>Follow3</p></div>
</body>
任意の引数で関数を呼び出すことができます
<body onmousemove="FollowMouse(d1,d2)">
または
<body onmousemove="FollowMouse(d1)">
スプレッド演算子を使用している間、それは渡される最後または唯一のパラメーターでなければならないことに注意する必要があります。そうでなければ失敗します。
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
開始引数として配列を渡す必要がある場合は、次のようにすることができます。
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
答えは出ましたが、ケーキだけあげたいです。あなたが達成したいものはmethod borrowing
、JSのコンテキストで呼び出されます。つまり、オブジェクトからメソッドを取得し、それを別のオブジェクトのコンテキストで呼び出します。配列メソッドを引数に適用することはよくあることです。例を挙げましょう。
したがって、2つの数値を引数として取り、「超安全」なハッシュ文字列を返す「超」ハッシュ関数があります。
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
これまでのところ良好ですが、上記のアプローチにはほとんど問題がありません。制約があり、2つの数値でのみ機能します。これは動的ではありません。任意の数値で機能させ、配列を渡す必要がないようにします(あなたがまだ主張する場合)。わかりました、十分な話、戦いましょう!
自然な解決策は、arr.join
メソッドを使用することです:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
ちょっと、あなた。残念ながら、それはうまくいきません。hash(arguments)とargumentsオブジェクトを呼び出しているため、オブジェクトは反復可能で配列のようですが、実際の配列ではありません。以下のアプローチはどうですか?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
トリックは呼ばれています method borrowing.
join
通常の配列からメソッドを借りて、のコンテキストで実行するために[].join.
使用[].join.call
しますarguments
。
なぜ機能するのですか?
これは、ネイティブメソッドの内部アルゴリズムが arr.join(glue)
が非常に単純だからです。
仕様からほぼ「現状のまま」:
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
したがって、技術的にはこれを取得してthis [0]、this [1]…などを結合します。これは、このような配列を許可するように意図的に記述されています(偶然ではなく、多くのメソッドがこの慣例に従います)。それがまた動作する理由ですthis=arguments.