Où va une fonction retournée si elle n'est pas stockée quelque part? Ne devrait-il pas être ajouté à l'objet global / au contexte extérieur actuel? Voici un exemple:

var setup = function(){
    console.log("xyz");
    return function goBack(){
        console.log("It's actually abc");
    }
}

Maintenant, lors de l'appel de setup () dans la portée globale, "xyz" est affiché dans la console, mais la fonction de retour, c'est-à-dire goBack n'est pas ajoutée dans la portée globale.

setup() //Outputs "xyz"

Maintenant, en essayant d'appeler goBack, sa portée globale n'est pas définie:

goBack() //error: goBack not defined

Maintenant, je pouvais accéder à goBack en utilisant setUp () () ou en stockant la fonction retournée de setup () dans une variable globale. Mais, ne devrais-je pas être en mesure d'accéder à goBack à partir de la portée globale une fois que j'ai exécuté setup ()? Parce que si j'avais stocké setup () dans une variable globale, j'aurais accès à goBack via cette variable. Mais que se passe-t-il si je n'utilise pas de variable pour stocker la fonction renvoyée par setup ()? Où goBack revient-il exactement? Je vous remercie.

1
Sebastian Neferu 27 janv. 2019 à 00:25

5 réponses

Meilleure réponse

Vous retournez un objet fonction , qui est le même que tout autre type d'objet ou toute autre sorte de valeur. Si vous ne l'affectez à rien, il sort simplement du champ d'application et sera récupéré. Rien ne se passe avec ça.

4
deceze 26 janv. 2019 à 21:27

Je dirais que vous ne pouvez pas exécuter la fonction goBack en raison de la portée lexicale: https://stackoverflow.com/a / 1047491/1836175 pas de fermetures: https: // développeur .mozilla.org / en-US / docs / Web / JavaScript / Closures.

Si vous souhaitez exécuter votre fonction goBack car elle est renvoyée par setup(), il vous suffit de stocker le retour de la fonction setup. Javascript a des fonctions de première classe: https://developer.mozilla.org / en-US / docs / Glossary / First-class_Function

Ainsi, le code pour pouvoir exécuter la fonction goBack plus tard serait:

var later = setup()
// do whatever you want and when needed 
later() // -> will call the goBack function

J'espère que cela aide à clarifier ce qui se passe :).

PS: et donc oui, si elle n'est pas stockée, la fonction sera récupérée (voir réponse de décongélation).

0
BenoitVasseur 26 janv. 2019 à 22:44

En fait, vous renvoyez un objet, qui peut être stocké dans une variable, puis exécuté, ou vous pouvez également l'exécuter directement.

    function a(){
    console.log("a");
    return function b(){
    console.log("b");
    };
    }
    console.log("this is calling just a");
    a();
    console.log("this is calling the a and the returned object");
    a()();
-2
Zorak 26 janv. 2019 à 21:33

Juste pour ajouter à la réponse de deceze - l'ajout à la portée globale est généralement une mauvaise chose, donc le langage ne le fait pas sauf si vous le voulez vraiment.

Un exemple - supposons que vous ayez une grande application avec beaucoup de bits de composant, et que beaucoup de ces bits de composant retournent une fonction lors de l'appel. Maintenant, vous devez vous assurer que chaque composant utilise un nom différent pour sa fonction, sinon vous pourriez finir par écraser le code global de quelqu'un d'autre, ce qui serait mauvais. Et si vous utilisez une bibliothèque javascript, vous devez vous assurer que vous n'utilisez pas les mêmes noms que la bibliothèque, car vous pourriez alors casser leur code.

Garder les choses dans le champ d'application est super important, et stocker des choses dans le monde est un bon moyen d'introduire des bugs qui sont vraiment très difficiles à corriger.

-2
Duncan Thacker 26 janv. 2019 à 21:43

Si vous ne la stockez pas dans une variable, elle sera récupérée lorsque la fonction setup reviendra et vous ne pourrez plus y accéder. D'un autre côté, vous pouvez écrire votre fonction de configuration comme ceci:

var setup = function(){
    console.log("xyz");

    window.goBack = function(){
        console.log("It's actually abc");
    }
}

Et avoir la fonction goBack disponible sur la portée globale.

Alors vous y accéderez via window.goBack() ou simplement goBack()

-1
Jay 26 janv. 2019 à 21:31