Domanda

Ho usato attivamente il modello di modulo rivelatore per anni, ma ci sono alcune cose che vorrei capire più a fondo. Da quello che ho capito i potenziali benefici delle funzioni di auto-esecuzione sono Anoymimty e l'autoeegnuzione, entrambi i quali non sembrano necessari/utilizzati in questo particolare modello. L'altra cosa che non capisco è: ciò che nello scenario seguente rende possibile avvolgere la funzione Init all'interno della funzione SocialMedia (), cioè una funzione incorporata, le funzioni di auto-esecuzione sembrano essere un costrutto molto unico in JS, non È strano che possiamo semplicemente assegnare valori di proprietà a un blocco di codice auto-esecuzione?

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

        }
        return  {
            Init: Init
        }
    })()
}
È stato utile?

Soluzione

Perché utilizziamo funzioni di auto-esecuzione nel modello di modulo rivelatore?

JavaScript ha funzioni di prima classe e manca di calcio, quindi le funzioni vengono utilizzate per introdurre nuovi ambiti.

Cosa nello scenario seguente rende possibile avvolgere la funzione Init all'interno della funzione SocialMedia (), cioè una funzione incorporata ... non è strano che possiamo semplicemente assegnare valori di proprietà a un blocco di codice auto-esecuzione?

In JavaScript, una funzione è solo un oggetto che risponde al () e new operatori.

Come altri oggetti, puoi usarlo quando lo si definisce o lo memorizzi in una variabile o proprietà per un uso successivo.

Le funzioni di auto-esecuzione sembrano essere un costrutto molto unico in JS

Questo non è unico per JavaScript. Tutte le lingue che hanno Funzioni di prima classe Avere questa proprietà, ad esempio:

  • Lisp,
  • Ocaml,
  • Scala,
  • Andare,
  • C# (tramite delegati),
  • C (tramite FN PTRS),
  • Pitone,
  • Perl (via &),
  • Rubino,
  • Lua

Nel recente sviluppo del linguaggio, le funzioni di prima classe sono la norma piuttosto che la regola. Le lingue non bastaticamente ti rendono più semplice perché non ci sono sovraccarichi nella sintassi del sistema di tipo e no varianza questioni.

Anche Java potrebbe saltare sul carrozzone con Lambdas previsto per Java 8.

In molte di queste altre lingue, immediatamente le funzioni non sono così utili. La maggior parte delle altre lingue lo sono scaricato a blocchi Quindi, se vuoi mantenere le tue variabili separate, usi solo un {...} bloccare. In JavaScript però, var è scoperto al più piccolo contenente function o programma, così functionS sono il modo più semplice per introdurre un nuovo ambito.

Rubino Fa pochissima distinzione tra blocchi e funzioni, quindi potrebbe essere considerato simile a JS in questo senso.

Altri suggerimenti

Le funzioni di auto-esecuzione vengono utilizzate per introdurre nuovi ambiti, vedi anche Mike Samuels Risposta.

Ci sono due ragioni per questo:

  • Evita di inquinamento dell'ambito globale
  • Uso di chiusure, cioè "esportare" una funzione da un ambito extra

Ovviamente puoi impilare gli ambiti, ma di solito non creerai così grandi moduli in cui devi evitare di inquinamento del tuo modulo locale :-)

Inoltre, la funzione di auto-esecuzione nel tuo esempio è inutile, in quanto è totalmente equivalente a

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

        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top