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);
};
Et si je veux la portée d'être le premier élément du tableau? ai-je besoin de truquer en utilisant shift()? – David
@David: Qu'entendez-vous par portée? Le mot-clé 'this'? – CMS
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