2009-12-10 20 views
13

Posso chiamare una funzione con array di argomenti in modo conveniente in JavaScript?Funzione di chiamata con array di argomenti

Esempio:

var fn = function() { 
    console.log(arguments); 
} 

var args = [1,2,3]; 

fn(args); 

Ho bisogno di essere arguments[1,2,3], proprio come il mio array.

risposta

26

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); 
}; 
+0

Cosa succede se voglio lo scopo di essere il primo elemento della matrice? ho bisogno di fingere usando shift()? – David

+0

@David: cosa intendi per ambito? La parola chiave 'this'? – CMS

+0

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

5

In ECMAScript 6, è possibile utilizzare spread syntax (...) a tale scopo. È molto più semplice e facile da capire rispetto a Function.prototype.apply().

Codice esempio:

const fn = function() { 
    console.log(arguments); 
} 

const args = [1,2,3]; 

fn(...args); 
Problemi correlati