71 votes

Comment exécuter une méthode passée en paramètre d'une fonction ?

Je veux écrire ma propre fonction en JavaScript qui prend une méthode de rappel comme paramètre et l'exécute après l'achèvement, je ne sais pas comment invoquer une méthode dans ma méthode qui est passée comme un argument. Comme Reflection.

exemple de code

function myfunction(param1, callbackfunction)
{
    //do processing here
    //how to invoke callbackfunction at this point?
}

//this is the function call to myfunction
myfunction("hello", function(){
   //call back method implementation here
});

103voto

lonesomeday Points 95456

Vous pouvez simplement l'appeler comme une fonction normale :

function myfunction(param1, callbackfunction)
{
    //do processing here
    callbackfunction();
}

La seule chose supplémentaire est de mentionner contexte . Si vous voulez être en mesure d'utiliser le this dans votre callback, vous devrez l'assigner. C'est souvent un comportement souhaitable. Par exemple :

function myfunction(param1, callbackfunction)
{
    //do processing here
    callbackfunction.call(param1);
}

Dans le callback, vous pouvez maintenant accéder à param1 como this . Voir Function.call .

0 votes

Que faire si je veux passer un argument à la fonction de rappel lorsque mafonction est appelée ? Par exemple, myfunction("hello", function(arg1) { console.log(arg1); })

0 votes

@AshleyWilson la même chose s'applique. Vous devez juste vous assurer que la fonction est appelée avec l'argument, sans l'appel. ex : callbackfunction(param1) .

8voto

Kiran Points 66

J'ai également rencontré le même scénario où je dois appeler la fonction envoyée comme paramètre à une autre fonction.

J'ai essayé

mainfunction('callThisFunction');

Première approche

function mainFuntion(functionName)
{
    functionName();
}

Mais il finit par faire des erreurs. J'ai donc essayé

Deuxième approche

functionName.call(). 

Toujours pas d'utilité. J'ai donc essayé

Troisième approche

this[functionName]();

qui a fonctionné comme un champion. Il s'agit donc d'ajouter un moyen supplémentaire d'appeler. Il se peut qu'il y ait un problème avec ma première et ma deuxième approche, mais au lieu de chercher sur Internet et de perdre du temps, j'ai choisi la troisième approche.

2voto

Roki Points 1747
function myfunction(param1, callbackfunction)
{
    //do processing here
   callbackfunction(); // or if you want scoped call, callbackfunction.call(scope)
}

0 votes

Pouvez-vous m'en dire plus sur l'appel scopé ?

1 votes

@Ummar : "Scoped" n'est pas le bon terme, @Roki parle de ce que l'on appelle le "Scoped". this dans l'appel sera la valeur. Vous pouvez déterminer explicitement ce que this est dans callbackfunction en utilisant call (ou apply ). Cela n'a rien à voir avec la portée, cependant. Le terme habituel est "contexte" (par exemple, définir le contexte de l'appel).

0 votes

T.J. a raison. Le "contexte" d'exécution par défaut dans les fonctions globales est la fenêtre mais si vous voulez le changer, vous pouvez appeler la fonction avec un objet différent.

1voto

SharpC Points 488

Tous les exemples présentés ici semblent montrer comment le déclarer, mais pas comment l'utiliser. Je pense que c'est aussi la raison pour laquelle @Kiran a eu tant de problèmes.

L'astuce consiste à déclarer la fonction qui utilise un callback :

function doThisFirst(someParameter,  myCallbackFunction) {
    // Do stuff first
    alert('Doing stuff...');

    // Now call the function passed in
    myCallbackFunction(someParameter);
}

El someParameter peut être omis s'il n'est pas nécessaire.

Vous pouvez ensuite utiliser le rappel comme suit :

doThisFirst(1, myOtherFunction1);
doThisFirst(2, myOtherFunction2);

function myOtherFunction1(inputParam) {
    alert('myOtherFunction1: ' + inputParam);
}

function myOtherFunction2(inputParam) {
    alert('myOtherFunction2: ' + inputParam);
}

Notez comment la fonction de rappel est passée et déclarée sans guillemets ni parenthèses .

  • Si vous utilisez doThisFirst(1, 'myOtherFunction1'); il échouera.
  • Si vous utilisez doThisFirst(1, myOtherFunction3()); (je sais qu'il n'y a pas d'entrée de paramètre dans ce cas) alors il appellera myOtherFunction3 premièrement donc vous obtenez des effets secondaires involontaires.

1voto

Moises D Points 11

object[functionName]();

objet : fait référence au nom de l'objet.

nom de la fonction : est une variable dont la valeur sera utilisée pour appeler une fonction.

en plaçant la variable utilisée pour faire référence au nom de la fonction à l'intérieur de la balise [] et le () à l'extérieur des crochets, nous pouvons appeler dynamiquement la fonction de l'objet en utilisant la variable. La notation par points ne fonctionne pas car elle pense que 'functionName' est le nom réel de la fonction et non la valeur que 'functionName' contient. Cela m'a rendu fou pendant un certain temps, jusqu'à ce que je tombe sur ce site. Je suis heureux que stackoverflow.com existe <3

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