448 votes

Transférer des arguments à une autre fonction javascript

J'ai essayé ce qui suit, sans succès :

function a(args){
    b(arguments);
}

function b(args){
    // arguments are lost?
}

a(1,2,3);

Dans la fonction a, je peux utiliser le mot-clé arguments pour accéder à un tableau d'arguments, dans la fonction b, ceux-ci sont perdus. Existe-t-il un moyen de passer des arguments à une autre fonction javascript comme j'essaie de le faire ?

3 votes

@BobStein-VisiBone D'accord. De plus, notez que arguments n'est pas en fait un tableau (mais plutôt un objet qui implémente une sémantique de type tableau ) et il n'est donc pas évident, à première vue, de savoir s'il peut être utilisé de la même manière qu'un tableau réel.

0 votes

@Jules encore vote pour la réouverture après toutes ces années. Quel est le badge pour avoir brûlé le précieux travail d'autres personnes ? Il y en a beaucoup pour tout le monde.

586voto

Nick Craver Points 313913

Utilisez .apply() d'avoir le même accès à arguments en fonction b comme ceci :

console.log = function(x) { document.write(x === undefined ? undefined : JSON.stringify(x) + "<br />"); };

function a(){
    b.apply(null, arguments);
}
function b(){
    console.log(arguments); //arguments[0] = 1, etc
}
a(1,2,3);

Vous pouvez le tester ici .

0 votes

Que pourriez-vous faire pour passer une partie des arguments ?

22 votes

@Brett - Vous pouvez le copier dans un tableau puis le manipuler avant de le transmettre, par exemple : var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);

21 votes

Mais en utilisant apply comme ça pourrait foutre en l'air la portée de b (s'il s'agit d'une fonction interne d'un objet par exemple)

315voto

Opérateur d'écartement

L'opérateur d'étalement permet à une expression d'être développée aux endroits où plusieurs arguments (pour les appels de fonction) ou plusieurs éléments (pour les littéraux de tableau) sont attendus.

ECMAScript ES6 a ajouté un nouvel opérateur qui vous permet de le faire d'une manière plus pratique : ... Opérateur d'écartement .

Exemple sans utiliser le apply méthode :

function a(...args){
  b(...args);
  b(6, ...args, 8) // You can even add more elements
}
function b(){
  console.log(arguments)
}

a(1, 2, 3)

Note Cet extrait renvoie une erreur de syntaxe si votre navigateur utilise encore ES5.

Note de l'éditeur : Puisque le snippet utilise console.log() vous devez Ouvrez la console JS de votre navigateur pour voir le résultat. - il y aura pas de résultat en page.

Il affichera ce résultat :

Image of Spread operator arguments example

En bref, l'opérateur d'étalement peut être utilisé à différentes fins si vous utilisez des tableaux, il peut donc également être utilisé pour les arguments de fonction, vous pouvez voir un exemple similaire expliqué dans les docs officiels : Paramètres de repos

84voto

lwburk Points 29313

L'explication qu'aucune des autres réponses ne fournit est que les arguments originaux sont toujours disponibles, mais pas dans leur position initiale dans le système de gestion de l'information. arguments objet.

El arguments contient un élément pour chaque paramètre réel fourni à la fonction. Lorsque vous appelez a vous fournissez trois arguments : les nombres 1 , 2 et, 3 . Donc, arguments contient [1, 2, 3] .

function a(args){
    console.log(arguments) // [1, 2, 3]
    b(arguments);
}

Lorsque vous appelez b cependant, vous passez exactement un argument : a 's arguments objet. Ainsi, arguments contient [[1, 2, 3]] (c'est-à-dire un élément, qui est a 's arguments qui possède des propriétés contenant les arguments originaux de l'objet a ).

function b(args){
    // arguments are lost?
    console.log(arguments) // [[1, 2, 3]]
}

a(1,2,3);

Comme @Nick l'a démontré, vous pouvez utiliser apply pour fournir un ensemble arguments dans l'appel.

La méthode suivante permet d'obtenir le même résultat :

function a(args){
    b(arguments[0], arguments[1], arguments[2]); // three arguments
}

Mais apply est la solution correcte dans le cas général.

0 votes

Devriez-vous toujours passer this a apply ?

1 votes

@Flimm-oui, puisque les arguments sont le deuxième argument, il doit y avoir quelque chose pour le premier argument (cela peut être null ).

3voto

dreamLo Points 439

Si vous voulez ne passer que certains arguments, vous pouvez le faire comme ceci :

Foo.bar(TheClass, 'theMethod', 'arg1', 'arg2')

Foo.js

bar (obj, method, ...args) {
  obj[method](...args)
}

obj y method sont utilisés par le bar() tandis que le reste des arguments est transmis à l'appel réel.

-3voto

user2846569 Points 124

C'est ainsi que cela pourrait être fait, sans confusion sur les portées :

this.trigger.bind(arguments)();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X