2010-08-26 7 views
7

Ciao Sono stato impegnato a portare la mia conoscenza di JQuery al livello successivo, Finora penso di aver capito tutto ma, mentre mi sono avventurato su tutorial più avanzati, ho notato diverse istanze in cui la routine JQuery è avvolto in una chiusura (vedi sotto) tuttavia, la cosa che mi confonde è che passa un $ e restituisce JQuery. La mia domanda è perché? cosa posso fare con il JQuery restituito?Qual è il vantaggio di avvolgere una funzione jquery in una chiusura?

Apprezzerei davvero ogni luce che la gente possa versare su questo per me.

(function($){ 
    $(document).ready(function(){ 
    var arr = $.map($("LI"), function(item, index){ 
     while (index < 3) 
     { 
     return $(item).html(); 
     } 
     return null; 
    }); 
    $(document.body).append("<span>The first three authors are: " + 
     arr.join(", ") + "</span>"); 
    }); 
})(jQuery); 

Grazie in anticipo.

Rob

+0

Dove viene restituito * jQuery *? Non riesco a vederlo. Puoi essere più specifico? E anche '$' non viene mai passato. –

+1

Guardandolo ora posso vedere che la mia domanda era fasulle. Ora capisco che la funzione auto-invocazione prende il parametro $ che è passato all'argomento dell'oggetto jQuery globale. – user432350

+0

Duplicato di http://stackoverflow.com/questions/2235163/what-is-benefit-of-using-function-in-javascript, http://stackoverflow.com/questions/592396/what-is-the-purpose -di-auto-esecuzione-funzione-in-javascript e http://stackoverflow.com/questions/631187/javascript-scope-and-closure –

risposta

7

Si tratta di un self invocando funzione anonima (una funzione senza nome che viene dichiarato e subito eseguito), che accetta un argomento che viene assegnato al parametro $. Il valore passato per l'argomento è jQuery, la funzione jQuery.

Ciò è possibile in modo che la funzione stenografica $ possa essere utilizzata all'interno dell'ambito della funzione per indicare jQuery. Poiché tutto il codice all'interno della funzione si trova nell'ambito della funzione, è un buon modello per contenere autonomamente il codice e non inquinare lo spazio dei nomi globale.

E 'anche un bel modello per che consente di utilizzare la scorciatoia $ per jQuery all'interno della funzione - potrebbe essere il caso che il $ stenografia (window.$) viene assegnato qualcos'altro, come può accadere se si utilizzano più librerie su una pagina. Utilizzando lo schema, è comunque possibile utilizzare $ per fare riferimento all'oggetto jQuery nella funzione per familiarità e impeccabilità.

+0

Mille grazie per aver trovato il tempo di rispondere alla mia domanda. Brillante! – user432350

+0

Nessun problema, felice di aiutarti - Benvenuto in StackOverflow! –

+1

Posso anche essere un vantaggio verso la minimizzazione di javascript. Potresti passare più variabili globali verso la funzione: '(funzione (doc, win, $, SE) {...}) (finestra, documento, jQuery, SomethingElse);'.All'interno della funzione, 'doc',' win' e altri nomi di variabili saranno ridotti a un solo carattere dalla maggior parte degli ottimizzatori. – 7ochem

4

Se si sta scrivendo un plugin, usare

(function($) { 
    //stuff that uses the jquery lib using $ 
})(jQuery); 

Ciò equivale a

var __myf = function($) { 
    //stuff that uses the jquery lib using $ 
}; 
__myf(jQuery); 

Se si sta scrivendo codice della pagina, utilizzare

jQuery(function($) { 
    //stuff that uses the jquery lib using $ 
}); 

Qui, jQuery invocherà la tua funzione quando è pronta (quando il documento è caricato) e passerà se stessa come primo argomento a yo la tua funzione

+0

Mille grazie per aver trovato il tempo di rispondere. Tra tutte le risposte che ho ricevuto alla mia domanda ora capisco perfettamente cosa sta succedendo e, soprattutto, perché. – user432350

1

Questo mappa jQuery a $ per l'ambito della chiusura, evitando conflitti con altre librerie che possono anche richiedere il $ namespace (ad esempio MooTools).

+0

Grazie per aver trovato il tempo di rispondere alla mia domanda. hai davvero aiutato la mia ulteriore conoscenza. – user432350

Problemi correlati