Risposte:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
Consulta i documenti MDN per Function.prototype.apply()
.
Se l'ambiente supporta ECMAScript 6, è possibile utilizzare invece un argomento spread :
call_me(...args);
Perché non si passa l'intero array e lo si elabora secondo necessità all'interno della funzione?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
funzione. Manca solo un punto e virgola alla fine.
Nello standard ES6 c'è un nuovo operatore di diffusione ...
che fa esattamente questo.
call_me(...x)
È supportato da tutti i principali browser ad eccezione di IE.
L'operatore di diffusione può fare molte altre cose utili e la documentazione collegata fa davvero un buon lavoro nel dimostrarlo.
Come aveva risposto @KaptajnKold
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
E non è nemmeno necessario definire tutti i parametri per la funzione call_me. Puoi solo usarearguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
Nota questo
function FollowMouse() {
for(var i=0; i< arguments.length; i++) {
arguments[i].style.top = event.clientY+"px";
arguments[i].style.left = event.clientX+"px";
}
};
// ---------------------------
pagina 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>
può chiamare la funzione con qualsiasi argomento
<body onmousemove="FollowMouse(d1,d2)">
o
<body onmousemove="FollowMouse(d1)">
function foo([a,b,c], d){
console.log(a,b,c,d);
}
foo([1,2,3], 4)
function foo(a, b, c, d){
console.log(a, b, c, d);
}
foo(...[1, 2, 3], 4)
Durante l'utilizzo dell'operatore spread, dobbiamo notare che deve essere l'ultimo o l'unico parametro passato. Altrimenti fallirà.
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
Se è necessario passare un array come argomento iniziale, è possibile:
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
puoi utilizzare l'operatore di diffusione in una forma più semplice
[].concat(...array)
nel caso di funzioni che restituiscono array ma che devono passare come argomenti
Esempio:
function expectArguments(...args){
return [].concat(...args);
}
JSON.stringify(expectArguments(1,2,3)) === JSON.stringify(expectArguments([1,2,3]))
La risposta è già stata data, ma voglio solo dare il mio pezzo di torta. Quello che vuoi ottenere è chiamato method borrowing
nel contesto di JS, che quando prendiamo un metodo da un oggetto e lo chiamiamo nel contesto di un altro oggetto. È abbastanza comune prendere metodi array e applicarli agli argomenti. Lasciate che vi faccia un esempio.
Quindi abbiamo la funzione di hashing "super" che accetta due numeri come argomento e restituisce una stringa hash "super sicura":
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
Fin qui tutto bene, ma abbiamo pochi problemi con l'approccio sopra, è limitato, funziona solo con due numeri, che non è dinamico, facciamolo funzionare con qualsiasi numero e inoltre non devi passare un array (puoi se insisti ancora). Ok, basta parlare, litighiamo!
La soluzione naturale sarebbe quella di utilizzare il arr.join
metodo:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
Oddio. Sfortunatamente, non funzionerà. Perché stiamo chiamando hash (argomenti) e argomenti object è sia iterabile che simile a array, ma non un array reale. Che ne dici dell'approccio sotto?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
Il trucco si chiama method borrowing.
Prendiamo in prestito un join
metodo da un array normale [].join.
e lo utilizziamo [].join.call
per eseguirlo nel contesto di arguments
.
Perché funziona
Questo perché l'algoritmo interno del metodo nativo arr.join(glue)
è molto semplice.
Tratto dalla specifica quasi "così com'è":
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.
Quindi, tecnicamente prende questo e unisce questo [0], questo [1] ... ecc. Insieme. È intenzionalmente scritto in un modo che consente qualsiasi array simile a questo (non una coincidenza, molti metodi seguono questa pratica). Ecco perché funziona anche conthis=arguments.