756 votes

javascript pass function comme paramètre

Comment passer une fonction en paramètre sans la fonction s'exécutant dans la fonction "parent"? Aussi sans utiliser eval (), comme j'ai lu que c'est insecure (?).

J'ai:

 addContact(entityId, refreshContactList()) ;
 

Cela fonctionne, mais le problème est que refreshContactList se déclenche lorsque la fonction est appelée. Je pourrais le contourner avec eval (), mais ce n'est pas la meilleure pratique selon ce que j'ai lu.

1053voto

Steve Fenton Points 55265

Vous avez juste besoin d'enlever la parenthèse:

 addContact(entityId, refreshContactList);
 

Cela passe ensuite la fonction sans l'exécuter en premier.

Voici un exemple:

 function addContact(id, refreshCallback) {
    refreshCallback();
    // You can also pass arguments if you need to
    // refreshCallback(id);
}

function refreshContactList() {
    alert('Hello World');
}

addContact(1, refreshContactList);
 

419voto

dallin Points 574

Si vous souhaitez passer une fonction de référence par son nom sans les parenthèses:

function foo(x) {
    alert(x);
}
function bar(func) {
    func("Hello World!");
}

//alerts "Hello World!"
bar(foo);

Mais parfois, vous pourriez voulez passer une fonction avec des arguments inclus, mais ne pas l'avoir appelé, jusqu'à ce que le callback n'est appelé. Pour ce faire, lors de l'appel, il suffit de l'envelopper dans une fonction anonyme, comme ceci:

function foo(x) {
   alert(x);
}
function bar(func) {
   func();
}

//alerts "Hello World!" (from within bar AFTER being passed)
bar(function(){ foo("Hello World!") });

Si vous préférez, vous pouvez également utiliser l' appliquer de fonction et un troisième paramètre qui est un tableau d'arguments, comme tel:

function eat(food1, food2)
{
    alert("I like to eat " + food1 + " and " + food2 );
}
function myFunc(callback, args)
{
    //do stuff
    //...
    //execute callback when finished
    callback.apply(this, args);
}

//alerts "I like to eat pickles and peanut butter"
myFunc(eat, ["pickles", "peanut butter"]); 

58voto

Gadde Points 756
 funct("z", function (x) { return x; });

function funct(a, foo){
foo(a) // this will return a

}

function foodemo(value){
return 'hello '+value;
}

 function funct(a, foo) {
    alert(foo(a));
 }

  //call funct
  funct('world! ',foodemo); //=> 'hello world!'
 

regarde ça

38voto

naivists Points 15639

Pour passer de la fonction en tant que paramètre, il suffit de supprimer les crochets!

function ToBeCalled(){
  alert("I was called");
}

function iNeedParameter( paramFunc) {
   //it is a good idea to check if the parameter is actually not null
   //and that it is a function
   if (paramFunc && (typeof paramFunc == "function")) {
      paramFunc();   
   }
}

//this calls iNeedParameter and sends the other function to it
iNeedParameter(ToBeCalled); 

L'idée derrière cela est qu'une fonction est tout à fait similaire à une variable. Au lieu d'écrire

function ToBeCalled() { /* something */ }

vous pouvez aussi bien écrire

var ToBeCalledVariable = function () { /* something */ }

Il existe des différences mineures entre les deux, mais de toute façon les deux d'entre eux sont valables façons de définir une fonction. Maintenant, si vous définissez une fonction et explicitement l'affecter à une variable, il semble tout à fait logique, que vous pouvez la passer en paramètre à une autre fonction, et vous n'avez pas besoin de parenthèses:

anotherFunction(ToBeCalledVariable);

18voto

series0ne Points 4389

Il y a une phrase parmi les programmeurs JavaScript: "Eval is Evil" alors essayez de l'éviter à tout prix!

En plus de la réponse de Steve Fenton, vous pouvez également passer des fonctions directement.

 function addContact(entity, refreshFn) {
    refreshFn();
}

function callAddContact() {
    addContact("entity", function() { DoThis(); });
}
 

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