149 votes

Fonctions qui renvoient une fonction - Javascript

I "a commencé à apprendre le JavaScript récemment et je suis coincé avec cette notion de "Fonctions qui retournent des fonctions'. Je fais référence au livre " Orienté Objet, Javascript, par Stoyan Stefanov. J'ai expérience préalable de la programmation en Java, C et C++ et aussi 2 ans d'expérience de travail en appliquant mes connaissances sur la même.

Extrait:

function a() {

    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b();
}

var s = a();
alert('break');
s();

Sortie:

A!
B!
break

Extrait De Deux

function a() {

    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b;
}

var s = a();
alert('break');
s();

Sortie:

A!
break
B!

Quelqu'un peut-il me dire la différence entre le retour b et b() dans le ci-dessus des extraits? J'ai essayé de chercher des trucs sur google, mais ne pouvait pas être digne de liens. Je serais heureux si quelqu'un m'a aussi donné quelques liens expliquant le concept. Merci et Salutations.

152voto

kzh Points 5098

L'affectation d'une variable à une fonction (sans les parenthèses) des copies de la référence à la fonction. Mettre les parenthèses à la fin d'un nom de fonction, les appels de la fonction, le retour des fonctions de valeur de retour.

Démo

function a() {
    alert('A');
}
//alerts 'A', returns undefined

function b() {
    alert('B');
    return a;
}
//alerts 'B', returns function a

function c() {
    alert('C');
    return a();
}
//alerts 'C', alerts 'A', returns undefined

alert("Function 'a' returns " + a());
alert("Function 'b' returns " + b());
alert("Function 'c' returns " + c());

Dans votre exemple, vous êtes également de définir des fonctions à l'intérieur d'une fonction. Tels que:

function d() {
    function e() {
        alert('E');
    }
    return e;
}
d()();
//alerts 'E'

La fonction est toujours exigible. Il existe encore. Il est utilisé en JavaScript tout le temps. Les fonctions peuvent être passés juste comme d'autres valeurs. Considérez les points suivants:

function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();

La fonction count pouvez garder les variables qui ont été définies en dehors d'elle. Cela s'appelle une fermeture. Il est aussi beaucoup utilisé en JavaScript.

53voto

Michael Berkowski Points 137903

Retourner le nom de la fonction sans () renvoie une référence à la fonction, qui peuvent être affectés comme vous l'avez fait avec var s = a(). s contient maintenant une référence à la fonction b(), et en appelant s() est fonctionnellement équivalent à l'appel de b().

// Return a reference to the function b().
// In your example, the reference is assigned to var s
return b;

L'appel de la fonction avec () dans une instruction de retour exécute la fonction, et retourne la valeur renvoyée par la fonction. Il est similaire à l'appel var x = b();, mais au lieu d'affecter la valeur de retour de l' b() vous êtes de retour de la fonction appelante a(). Si la fonction b() lui-même ne retourne pas de valeur, l'appel renvoie undefined après ce que d'autres travaux sont effectués par b().

// Execute function b() and return its value
return b();
// If b() has no return value, this is equivalent to calling b(), followed by
// return undefined;

45voto

Abdo Points 3360

return b(); appelle la fonction b () et renvoie son résultat.

return b; renvoie une référence à la fonction b, que vous pouvez stocker dans une variable à appeler ultérieurement.

21voto

Cheeso Points 87022

De retour b est de retour d'une fonction d'objet. En Javascript, les fonctions sont juste des objets, comme tout autre objet. Si vous trouvez que pas utile, il suffit de remplacer le mot "objet" avec la "chose". Vous pouvez retourner n'importe quel objet à partir d'une fonction. Vous pouvez retourner une valeur true/false. Un entier (1,2,3,4...). Vous pouvez retourner une chaîne de caractères. Vous pouvez retourner un objet complexe avec de multiples propriétés. Et vous pouvez revenir à une fonction. une fonction est une chose.

Dans votre cas, de revenir b retourne la chose, la chose est une fonction appelable. De retour b() renvoie la valeur retournée par la fonction appelable.

Considérer ce code:

function b() {
   return 42;
}

À l'aide de la définition ci-dessus, return b(); renvoie la valeur 42. D'autre part return b; retourne une fonction, qui elle-même renvoie la valeur de 42. Ils sont deux choses différentes.

7voto

vzwick Points 4324

Lorsque vous renvoyez b , il ne s'agit que d'une référence à la fonction b, mais elle n'est pas encore exécutée.

Lorsque vous renvoyez b() , vous exécutez la fonction et renvoyez sa valeur.

Essayez alert ing typeof(s) dans vos exemples. Snippet b vous donnera "fonction". Qu'est-ce que l'extrait vous donnera?

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