2013-08-24 17 views
7

Modifica per chiarezza - @ Qantas94Heavy - Capisco quello che sta "dicendo" o dovuto fare, quello che non capisco è il motivo per cui & più importante come funziona:Patterns JavaScript design aiuto necessario: Aumento allentato dei moduli

stavo leggendo un tutorial avanzato sul modello JS modulo, ed ha fatto questo esempio:

var MODULE = (function (my) { 
// add capabilities... 

return my; 
}(MODULE || {})); 

la cosa che mi sta intercettazioni (e ho bisogno del vostro aiuto con) è l'ultima dichiarazione:

(MODULE || {})); 

ho problemi a capire le regole di sintassi dietro ciò che lo rendono possibile. Dopo aver effettuato alcune ricerche per le parole chiave, "Sintassi del modulo JavaScript" e "Modella per il modello del modulo", ho scoperto che non riesco ancora a capire il fondamento dietro a questo.

Qualcuno potrebbe spiegarmi o indicarmi la giusta direzione per fare questo/approfondire la comprensione?

Cordiali saluti, gggi

+2

E 'o passando una parte già definita del modulo o se non esiste, la creazione di un nuovo oggetto per il modulo - la funzione viene chiamata immediatamente, passando il risultato della funzione all'assegnazione. –

+1

@ Qantas94Heavy Perché non scriverlo come risposta invece di un commento? – Bart

+0

@ Qantas94Heavy - Capisco cosa significa "dire" o si suppone di fare, ciò che non capisco è * perché * e, ancora più importante * come * funziona. – gogogadgetinternet

risposta

7
(function(){ 

})(); 

è una funzione anonima auto-invocazione. Nel tuo caso, gestisce il parametro "mio" dell'oggetto: fa qualcosa a "mio" e poi lo restituisce.

Nel tuo caso il parametro "mio" che la funzione riceve è "(MODULO || {})".

& & e || gli operatori sono chiamati operatori di cortocircuito. || ritornerà, se esiste l'oggetto "MODULE", l'oggetto "MODULE", altrimenti verrà creato un oggetto vuoto da utilizzare all'interno della funzione. La funzione farà qualsiasi cosa per quell'oggetto, che diventerà l'oggetto "MODULO" restituito.

Funziona creando una chiusura: finché esiste MODULE (non è garbage collection) così fa la funzione anonima autoinviante insieme al suo stato al momento dell'assegnazione. Ciò rende permanenti tutte le funzionalità aggiunte.

+0

Grazie @ itmitică - Immagino che il modo in cui mi è stato spiegato mi induca a pensare che ci fosse qualcosa di più qui in ballo che la semplice stenografia se si determina cosa è passato! In retrospettiva, questo è abbastanza semplice. – gogogadgetinternet

3

Il lato destro è chiamato funzione immediata. Per capire come funziona, cerchiamo di scomposizione un po ':

  1. (...)() possiamo chiamare una funzione in base al nome, vale a dire f(). Ma, invece del nome della funzione, possiamo inserire qualsiasi espressione che si risolve in una variabile di tipo funzione. Nel nostro caso, la prima serie di parentesi racchiude semplicemente un'espressione. Il secondo set è l'operatore di chiamata di funzione. In definitiva, equivale esattamente a f()

  2. Il secondo passaggio consiste nel fornire una funzione anonima all'interno della prima serie di parentesi. Il risultato è: (function(){})(). La funzione anonima è perfettamente di tipo funzione. Questo fa sì che la funzione venga creata, eseguita e scartata nella stessa istruzione.

  3. Il secondo gruppo di parentesi che è la funzione chiamata operatore può accettare parametri al suo interno, che è nel nostro caso MODULE || {}.Questa espressione significa: se è stato definito MODULE, utilizzarlo, altrimenti, creane uno nuovo vuoto.

  4. Il parametro viene passato alla funzione anonima come argomento chiamato my e la funzione anonima restituisce, um, my. Ciò fa sì che la funzione anonima valuti a my e in effetti: (my)(MODULE || {}).

  5. L'effetto è MODULE è autonomo e non provoca conflitti di nomi con variabili esterne. Mentre, allo stesso tempo, ha accesso a variabili esterne.

Spero che questo libera :)