2011-10-27 15 views
6
fonte

Il jQuery è avvolto in una chiusura, come questo:Perché sono questi due parametri nell'origine jQuery?

(function(window, undefined) { 
    //awesome jQuery library code in here 
})(window); 

Non capisco il motivo per cui sono necessari uno di questi parametri.

Poiché window è una variabile globale, perché deve essere inoltrata? Qual è lo scopo di passare un parametro globale e accedervi all'interno della chiusura con lo stesso nome?

A cosa serve il parametro undefined? Perché non viene passato alcun valore ad esso?

+0

la finestra verrà utilizzata come locale in questo ambito, rendendo più veloce l'accesso, credo. – Ibu

risposta

11

Sono abbastanza sicuro che questo è stato già risposto, ma:

  • passando window a) consente la compressione del codice a munge il nome (cioè sostituendolo con un nome di variabile singola lettera entro l'anonimo funzione) e b) assicura che la variabile faccia riferimento all'oggetto della finestra al momento della definizione della libreria, nel caso in cui qualcuno ridefinisce lo window nell'ambito globale dopo il caricamento di jQuery.

  • compreso undefined come argomento (ma non passando un valore) fa la stessa cosa per undefined, permettendo munging variabile ed evitando problemi se si ridefinisce la variabile undefined (yup, JavaScript consente).

credo in entrambi i casi questo dovrebbe accelerare i riferimenti alla variabile, in quanto rende entrambe le variabili globali disponibili nel campo di applicazione funzioni, che l'interprete cercherà prima di guardare in ambito globale. Ma non posso onestamente immaginare che la differenza di prestazioni qui sia sostanziale - penso che il problema più grande sia la variabile nome munging, che rende più compatto il codice quando viene minimizzato.

+0

ha senso, +1 – Ibu

+0

Se 'window' è stata ridefinita nell'ambito globale, non sarebbe ancora stata ridefinita quando la si passa? –

+2

@PeterOlson - non se è ridefinito in seguito - questo corregge il riferimento 'window' nel momento in cui viene caricata la libreria jQuery, quindi i successivi shenanigans' window' non avranno alcun effetto. Suppongo che se si ridefinisce la finestra prima che la libreria si carichi, questo si interrompe, ma poi si merita ciò che si ottiene :). – nrabinowitz

Problemi correlati