0
votes

Fermeture en JavaScript avec fonction inline

Permet de dire, j'ai défini une fonction comme

var f = fonction (cb) {cb ()};

maintenant, si je passe une fonction de rappel Il fonctionnera:

f (() => {console.log ("CCB")}); // Imprimer: CCB

Mais si je passe un argument, X / P>

f ((x) = {console .log ("x:" + x);}); // x ne sera indéfini

une solution consiste à utiliser la fermeture, xxx

mais si j'essaie d'obtenir une fermeture à l'aide de La fonction, en considérant XX est définie. xxx

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.


4 commentaires

Vous exécutez la fonction externe avec la signature fonction (xx) qui renvoie une nouvelle fonction avec la signature fonction () 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 qui l'appellerait. f () ne fait pas rien 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 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 pour faire quelque chose f n'est pas conçu pour le faire et approcher en changeant ce que vous passez à f ... Mais peu importe ce que vous passez à f il ne changera pas comment f fonctionne.


4 Réponses :


2
votes

Dans votre code, vous n'appelez pas votre fonction inline avec 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.

p>

var f = function(cb){cb()};
var xx = 20;
f((function(xx){
    return function(){
        console.log("xxx: "+xx)
    }
})(xx));


4 commentaires

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 exécuter CBA 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) - 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.



0
votes

Utiliser Bind code> Pour lier le paramètre:

p>

const f = function(x){x()};
const param = 12

f(function(x){
    console.log("ccbbaa:"+x)
}.bind(null, param))


0 commentaires

0
votes

Le seul moyen de faire ce travail est de donner à la fonction anonyme une valeur par défaut pour xx xxx


2 commentaires

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.



0
votes

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));


0 commentaires