2009-12-10 4 views
13

Puis-je appeler une fonction avec un tableau d'arguments de manière pratique en JavaScript?Fonction d'appel avec un tableau d'arguments

Exemple:

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

var args = [1,2,3]; 

fn(args); 

J'ai besoin arguments être [1,2,3], tout comme mon tableau.

Répondre

26

Vous devez utiliser apply:

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

var args = [1,2,3]; 

fn.apply(null, args); 

Appliquer fera l'appel de fonction équivalente:

fn(1,2,3); 

Notez que je null comme premier argument de apply, qui établira le mot-clé this à l'objet global (window) à l'intérieur fn.

De plus, vous devriez savoir que l'objet arguments n'est pas vraiment un tableau, c'est un objet de type tableau, qui contient des index numériques correspondant aux arguments utilisés pour appeler votre fonction, une propriété length qui vous donne le nombre de arguments utilisés, et la propriété arguments.callee qui est une référence à la fonction d'exécution (utile pour la récursivité sur les fonctions anonymes).

Si vous voulez faire un tableau à partir de votre objet arguments, vous pouvez utiliser la méthode Array.prototype.slice:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments); 
    console.log(args); 
}; 

Edit: En réponse à votre commentaire, oui, vous pouvez utiliser la méthode shift et définir sa valeur retournée que le contexte (le mot-clé this) sur votre fonction:

fn.apply(args.shift(), args); 

Mais rappelez-vous que shift supprimera les premier élément du tableau original, et votre fonction sera appelée sans ce premier argument.

Si vous avez besoin d'appeler votre fonction avec tous vos autres arguments, vous pouvez:

fn.apply(args[0], args); 

Et si vous ne voulez pas changer le contexte, vous pouvez simplement extraire le premier argument dans votre fonction:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments), 
     firstArg = args.shift(); 

    console.log(args, firstArg); 
}; 
+0

Et si je veux la portée d'être le premier élément du tableau? ai-je besoin de truquer en utilisant shift()? – David

+0

@David: Qu'entendez-vous par portée? Le mot-clé 'this'? – CMS

+0

Oui, en utilisant apply(), le premier argument devient la portée (this) pour la fonction, non? La portée dans ce cas doit être le premier élément de tableau. – David

5

En ECMAScript 6, vous pouvez utiliser spread syntax (...) à cette fin. C'est beaucoup plus simple et plus facile à comprendre que Function.prototype.apply().

Exemple de code:

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

const args = [1,2,3]; 

fn(...args); 
Questions connexes