Permet de dire, j'ai défini une fonction comme
maintenant, si je passe une fonction de rappel Il fonctionnera: p> Mais si je passe un argument, X / P> P> une solution consiste à utiliser la fermeture, p> mais si j'essaie d'obtenir une fermeture à l'aide de La fonction, en considérant XX est définie. p> rappel à l'intérieur de F n'est pas appelé.
Pourquoi? Comment allons-nous utiliser cette fonction en ligne pour le faire fonctionner? J'étudie des fermetures alors je voulais comprendre cela. Toute aide est appréciée. P> p> var f = fonction (cb) {cb ()}; code> p>
f (() => {console.log ("CCB")}); // Imprimer: CCB CODE> P>
f ((x) = {console .log ("x:" + x);}); // x ne sera indéfini code> p>
4 Réponses :
Dans votre code, vous n'appelez pas votre fonction inline avec p> xx code>. Vous faites simplement passer la fonction inline à
f code> qui sera exécutée, mais cela n'imprimera rien parce que la fonction intitulée appelée renvoie simplement une autre fonction qui n'est jamais appelée.
var f = function(cb){cb()};
var xx = 20;
f((function(xx){
return function(){
console.log("xxx: "+xx)
}
})(xx));
Merci pour une réponse rapide et désolé pour la question naïve, mais selon cette logique, pourquoi F (CBA (20)); travaillé
@Nikhilkumar parce que vous i> exécuter i> CBA code> qui renvoie ensuite une fonction (unique). La même chose est exacte si vous avez
(fonction (xx) {fonction de retour () {console.log ("xxx:" + xx)}}) (xx) code> - vous avez une fonction qui est exécuté et retourne une fonction (à un niveau). La seule différence est que dans ce dernier cas, vous avez un ife mais rien n'est vraiment fondamentalement différent - vous obtenez le même résultat de toute façon.
@Vlaz oh je l'ai eu maintenant, merci. Je me demande comment utiliser la fonction arrow dans ce cas, comme `f ((xx) => {revenir fonction () {console.log (" xxx: "+ xx)}} (xx));". Est-ce correct?
@Nikhilkumar Oui, cela fonctionnerait syntaxiquement. Mais la question est de savoir pourquoi vous voulez un ami du tout? Il ne fournit aucun avantage sur l'utilisation d'une fonction normale. Si nécessaire, une application partielle peut être utilisée pour pré-définir des paramètres que la fonction attend. Avec celles-ci (et d'autres techniques, comme Currying), vous pouvez prendre une fonction normale qui prend des paramètres et produit Thunks < / a> qui sont essentiellement des fonctions qui ne s'attendent pas à un paramètre, mais vous pouvez exécuter plus tard.
Utiliser p> Bind code> Pour lier le paramètre:
const f = function(x){x()};
const param = 12
f(function(x){
console.log("ccbbaa:"+x)
}.bind(null, param))
Le seul moyen de faire ce travail est de donner à la fonction anonyme une valeur par défaut pour xx
Cela ne va toujours pas exécuter la fonction interne renvoyée de l'extérieur.
Cela ne fonctionne pas car f retournera toujours indéfini car il ne renvoie rien. La fonction interne n'est jamais retournée après la fonction (XX) est exécutée par f. Pour le faire fonctionner, vous devez exécuter la fonction intérieure. J'ai édité le code pour le faire fonctionner.
La fonction en ligne renvoie une autre fonction qui n'est jamais appelée.
var f = function(cb){cb()}; var xx = 20; f((function(xx){ return function(){ console.log("xxx: "+xx) } })(xx));
Vous exécutez la fonction externe i> avec la signature
fonction (xx) code> qui renvoie une nouvelle fonction avec la signature
fonction () code> mais vous n'exécutez jamais ce dernier. Comme il n'est pas encore jamais retourné, vous ne pouvez pas l'invoquer après, non plus. Il vient de produire et à quelques ordures recueillies.
"Le rappel à l'intérieur de F n'est même pas appelé. Pourquoi?" - parce que vous avez fait rien b> qui l'appellerait.
f () code> ne fait pas rien b> avec la valeur de retour, il obtient d'appeler la fonction transmise à celle-ci.
@Quentin Comment nous pouvons changer cela pour le faire fonctionner?
@Nikhilkumar - Vous avez posé une solution très abstraite i> et une solution cassée à un problème qui n'est pas vraiment clairement défini. Il est difficile de dire comment résoudre le problème réel parce que nous ne savons pas ce que c'est. Vous semblez simplement vouloir que
f code> pour faire quelque chose
f code> n'est pas conçu pour le faire et approcher en changeant ce que vous passez à
f code > ... Mais peu importe ce que vous passez à
f code> il ne changera pas comment
f code> fonctionne.