2012-11-01 17 views
5

Ho consultato la fonte di jQuery su questo, ma devo ammettere che è probabilmente oltre la mia comprensione - o sto cercando nel posto sbagliato.jQuery each() - Come funziona veramente internamente?

Intorno alla riga 222 c'è una funzione che sembra ricorsiva, e poi ancora intorno alla riga 566 ce n'è un'altra dichiarata nello spazio dei nomi .extend().

Sono solo curioso: come funziona esattamente? Per esempio, quando io chiamo:

$('.item').each(function(){ 
    // Do Something 
}); 

Come fa a sapere per scorrere l'array di elementi DOM, quando fermarsi, come si applica la funzione? Non può fare solo

$('.item').doThis() 

perché doThis() potrebbe non essere un membro di tale oggetto.

Per favore chiariscimi :) grazie.

+1

https://github.com/jquery/jquery/blob/master/src/core.js#L596, ecco dove avviene la magia ... nessuna ricorsione da nessuna parte. Ammetto che il ciclo 'for' sembra un po 'imbarazzante, ma non è niente di speciale. –

+0

Hai mai provato a leggere un codice sorgente di jQuery? sarebbe meglio. Inoltre, il 90% delle persone che utilizzano jQuery a livello professionale non ha idea di come funzioni. ;) – deb0rian

+1

La vera funzione è sulla linea 566. – Joe

risposta

2

No, non è ricorsivo. La funzione su line 222 è quella sul prototipo di jQuery ($.fn), mentre la funzione che chiama è jQuery.each - una proprietà statica che è definita in line 566. Nota come funziona extend: Se non viene fornito alcun oggetto da estendere, utilizza this. È applicato entrambi su jQuery e jQuery.fn in diverse sezioni del codice.

così come funziona esattamente?

$obj.each(callback) sta chiamando il metodo $.fn.each, che applica $.each sull'istanza jQuery (l'involucro DOM) stesso: line 223.

Ora, in $.each, ci sono quattro casi: con o senza l'array args fornito, e su una struttura tipo array o su altri oggetti. Non hai passato ulteriori argomenti e le istanze di jQuery hanno una proprietà length e hanno gli elementi DOM in indici numerici, quindi verrà eseguito il ciclo in line 596. Quindi, la chiamata è equivalente a

for (var i=0, len=$obj.length; i<len; i++) 
    if (callback.call($obj[i], i, $obj[i]) === false) break; 
+1

Grazie - è stato particolarmente utile chiarire quale funzione era ed esattamente cosa stava facendo il metodo extend(). È un peccato che questo thread sia stato chiuso - mi sento come se altri utenti di jQuery potessero fare con la comprensione delle interiora. L'unica cosa che mi imbarazza ancora è come avviene l'iterazione - per esempio, quando fornisco una serie di tre elementi, come viene portato quell'array in ogni funzione se non è davvero un argomento? – netpoetica

+0

È il primo argomento di '$ .each' -' obj'. Se si usa '$ .fn.each', viene passata l'istanza jQuery di tipo array (' this'). – Bergi

2

Per quanto io sappia, questo

$('selector').each(func); 

è l'equivalente di fare questo:

func = ...; 
$selector = $('selector'); 
for (var i = 0; i < $selector.length; i++) { 
    if (func.call($selector[i], i, $selector[i]) === false) { 
     break; 
    } 
} 

L'oggetto restituito da una selezione $ è in realtà un array di elementi DOM con un un sacco di metodi extra ad esso collegati, quindi puoi fondamentalmente lavorare con esso proprio come faresti con una matrice. Spero che chiarisca le cose!

+2

Strettamente parlando è equivalente a 'func.call ($ selector [i], i, $ selector [i]);'. –

+0

Grazie per questo Felix, hai ragione. – LukeGT

0

Ogni query si fa in jQuery viene memorizzato come un array come oggetto, significa che è possibile accedere alla lista degli elementi DOM query ha trovato in questo modo:

$('.item')[0] //The first item found by your query 

Internamente, $(). Ognuno usa $ .each, che è un modo per iterare attraverso la tua collezione, chiamare la funzione che hai passato come argomento, e usare 'Function.apply' per impostare 'questo' come corrente oggetto viene iterato attraverso.