159 votes

Appel de fonction dynamique avec les paramètres dynamiques en Javascript

Je suis à la recherche d'un truc à ce sujet. Je sais comment appeler une dynamique, de l'arbitraire de la fonction en Javascript, en passant des paramètres spécifiques, quelque chose comme ceci:

function mainfunc (func, par1, par2){
    window[func](par1, par2);
}

function calledfunc(par1, par2){
    // Do stuff here
}

mainfunc('calledfunc','hello','bye');

Je sais comment passer en option, un nombre illimité de paramètres à l'aide des arguments de[] de la collection à l'intérieur de mainfunc, mais, je ne peux pas comprendre comment envoyer un nombre arbitraire de paramètres à mainfunc être envoyé à calledfunc dynamiquement; comment puis-je accomplir quelque chose de ce genre, mais avec un nombre quelconque d'arguments optionnels (n'utilisant pas le laid if-else)? :

function mainfunc (func){
    if(arguments.length == 3)
        window[func](arguments[1], arguments[2]);
    elseif(arguments.length == 4)
        window[func](arguments[1], arguments[2], arguments[3]);
    elseif(arguments.length == 5)
        window[func](arguments[1], arguments[2], arguments[3], arguments[4]);
}

function calledfunc1(par1, par2){
    // Do stuff here
}

function calledfunc2(par1, par2, par3){
    // Do stuff here
}

mainfunc('calledfunc1','hello','bye');
mainfunc('calledfunc2','hello','bye','goodbye');

Je m'excuse pour mon mauvais anglais, veuillez me demander si vous avez besoin de quelques éclaircissements au sujet de mon (compliqué) question.

Merci à l'avance!

195voto

AnthonyWJones Points 122520

Utilisez la méthode apply d’une fonction :-

Edit: il se présente à moi que ce serait beaucoup plus utile avec un tweak légère :-

Cela fonctionne en dehors du navigateur ( `` par défaut à l’espace global). L’utilisation de l’appel sur mainfunc travaillerait également :-

24voto

Ferdinand Beyer Points 27723

Votre code ne fonctionne que pour les fonctions globales, c’est à dire. membres de le `` objet. Pour l’utiliser avec des fonctions arbitraires, passer à la fonction elle-même plutôt que son nom comme une chaîne :

15voto

Greg Points 132247

Vous pouvez utiliser``

Vous devez spécifier une ... Je suppose que vous pourriez utiliser les dans `` .

12voto

James Points 56229

Voici ce dont vous avez besoin:

function mainfunc (){
    window[Array.prototype.shift.call(arguments)].apply(null, arguments);
}

Le premier argument est utilisé comme le nom de la fonction et de tous les autres, ceux qui sont utilisés comme arguments de la fonction appelée...

Nous sommes en mesure d'utiliser l' shift méthode de retour et puis supprimer la première valeur du tableau d'arguments. Notez que nous avons appelé à partir de la Matrice de prototype, puisque, à proprement parler, des "arguments" n'est pas un vrai tableau et ainsi de ne pas hériter de la shift méthode comme un tableau normal le ferait.


Vous pouvez également appeler le changement de méthode comme ceci:

[].shift.call(arguments);

3voto

Pavel Křupala Points 41

Si vous souhaitez passer avec les « arguments » quelques autres, il faut créer le tableau d’arguments tous ensemble, c'est-à-dire comme ceci :

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