Pourquoi utilisons-nous des fonctions auto-exécutables dans le modèle de module révélateur ?

StackOverflow https://stackoverflow.com/questions/9458285

Question

J'utilise activement le modèle de module révélateur depuis des années, mais il y a certaines choses que j'aimerais comprendre plus en profondeur.D'après ce que j'ai compris, les avantages potentiels des fonctions auto-exécutables sont l'anonymat et l'auto-exécution, qui ne semblent pas tous deux nécessaires/utilisés dans ce modèle particulier.L'autre chose que je ne comprends pas, c'est ce qui, dans le scénario ci-dessous, permet d'envelopper la fonction Init dans la fonction SocialMedia (), c'est-à-dire une fonction intégrée, les fonctions auto-exécutables semblent être une construction tout à fait unique dans JS, n'est-ce pas ? N'est-il pas étrange que nous puissions simplement attribuer des valeurs de propriétés à un bloc de code auto-exécutable ?

var myObj = {
    prop1, "prop1value",
    SocialMedia: (function () {
        function Init() {

        }
        return  {
            Init: Init
        }
    })()
}
Était-ce utile?

La solution

Pourquoi utilisons-nous des fonctions auto-exécutables dans le modèle de module révélateur ?

JavaScript possède des fonctions de première classe et manque de portée de bloc, les fonctions sont donc utilisées pour introduire de nouvelles portées.

ce qui, dans le scénario ci-dessous, permet d’encapsuler la fonction Init à l’intérieur de la fonction SocialMedia(), c’est-à-dire une fonction intégrée ...n'est-il pas étrange que nous puissions simplement attribuer des valeurs de propriétés à un bloc de code auto-exécutable ?

En JavaScript, une fonction est simplement un objet qui répond à la () et new les opérateurs.

Comme les autres objets, vous pouvez l'utiliser lorsque vous le définissez ou le stocker dans une variable ou une propriété pour une utilisation ultérieure.

les fonctions auto-exécutables semblent être une construction tout à fait unique dans JS

Ce n'est pas propre à JavaScript.Toutes les langues qui ont fonctions de première classe avoir cette propriété, par exemple :

  • Zézayer,
  • OCaml,
  • Scala,
  • Aller,
  • C# (via les délégués),
  • C (via fn ptrs),
  • Python,
  • Perl (via &),
  • Rubis,
  • Lua

Dans le développement récent du langage, les fonctions de première classe sont la norme plutôt que la règle.Les langages à typage non statique facilitent simplement les choses car il n'y a pas de surcharge dans la syntaxe du système de types et aucun variance problèmes.

Même Java pourrait prendre le train en marche avec Lambdas prévus pour Java 8.

Dans beaucoup de ces autres langages, les fonctions immédiatement appelées ne sont cependant pas très utiles.La plupart des autres langues sont à portée de bloc donc si vous souhaitez garder vos variables séparées, utilisez simplement un {...} bloc.En JavaScript cependant, var est limité au plus petit contenant function ou Programme, donc functionC'est le moyen le plus simple d'introduire une nouvelle portée.

Rubis fait très peu de distinction entre les blocs et les fonctions et pourrait donc être considéré comme similaire à JS à cet égard.

Autres conseils

Les fonctions d'auto-exécution sont utilisées pour introduire de nouvelles étendues, voir également la réponse Mike Samuels.

Il y a deux raisons pour cela:

  • Évitez de polluer la portée globale
  • utilisation de fermetures, c'est-à-dire "" exportation "une fonction d'une portée supplémentaire

    Bien sûr, vous pouvez empiler des étendues, mais vous ne créerez généralement pas que les gros modules où vous devez éviter de polluer votre module locale: -)

    En outre, la fonction d'exécution auto-exécutive dans votre exemple est inutile, car elle est totalement équivalente à

    var myObj = {
        prop1: "prop1value",
        SocialMedia: {
            Init: function Init() {
    
            }
        }
    }
    

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top