Si dovrebbe usare apply
:
var fn = function() {
console.log(arguments);
};
var args = [1,2,3];
fn.apply(null, args);
Applicare farà la chiamata di funzione equivalente:
fn(1,2,3);
Si noti che ho usato null
come primo argomento di apply
, che fisserà la parola chiave this
a l'oggetto globale (window
) all'interno di fn
.
Inoltre, è necessario sapere che l'oggetto arguments
non è realmente un array, è un oggetto di tipo array, che contiene indici numerici corrispondenti agli argomenti utilizzati per chiamare la propria funzione, una proprietà length
che fornisce il numero di argomenti utilizzati e la proprietà arguments.callee
che è un riferimento alla funzione in esecuzione (utile per la ricorsione su funzioni anonime).
Se si vuole fare una matrice dalla arguments
oggetto, è possibile utilizzare il metodo Array.prototype.slice
:
var fn = function() {
var args = Array.prototype.slice.call(arguments);
console.log(args);
};
Edit: In risposta al tuo commento, sì, è possibile utilizzare il metodo shift
e impostare il suo valore restituito come il contesto (la parola this
) sulla vostra funzione:
fn.apply(args.shift(), args);
Ma ricordate che shift
rimuoverà il il primo elemento dell'array originale e la funzione verrà chiamata senza quel primo argomento.
Se hai ancora bisogno di chiamare la funzione con tutti gli altri argomenti è possibile:
fn.apply(args[0], args);
E se non si desidera modificare il contesto, si potrebbe semplicemente estrarre il primo argomento all'interno vostra funzione:
var fn = function() {
var args = Array.prototype.slice.call(arguments),
firstArg = args.shift();
console.log(args, firstArg);
};
Cosa succede se voglio lo scopo di essere il primo elemento della matrice? ho bisogno di fingere usando shift()? – David
@David: cosa intendi per ambito? La parola chiave 'this'? – CMS
Sì, usando apply(), il primo argomento diventa scope (questo) per la funzione, giusto? L'ambito in questo caso deve essere il primo elemento dell'array. – David