2012-11-01 11 views
5

Ich habe die jQuery-Quelle zu diesem Thema konsultiert, aber ich muss zugeben, es ist wahrscheinlich jenseits meines Verständnisses - oder ich suche am falschen Ort. https://github.com/jquery/jquery/blob/master/src/core.jsjQuery each() - Wie funktioniert es wirklich intern?

Strecken Linie 222 gibt es eine Funktion, die rekursiv aussieht, und dann wieder um die Linie 566 gibt es ein weiteres in .extend() Namespace deklariert.

Ich bin nur neugierig - wie genau funktioniert das? Zum Beispiel, wenn ich rufe:

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

Wie es mit dem Fahrrad durch die Anordnung von DOM-Elementen nicht kennt, wann man aufhören muss, wie funktioniert es die Funktion anwenden? Es kann nicht einfach

$('.item').doThis() 

weil DoThis() möglicherweise kein Mitglied dieses Objekts sein.

Bitte erleuchte mich :) danke.

+1

https://github.com/jquery/jquery/blob/master/src/core.js#L596, das ist, wo die Magie passiert ... keine Rekursion überall. Ich gebe zu, dass die 'for'-Schleife ein wenig peinlich aussieht, aber es ist nichts Besonderes. –

+0

Haben Sie schon einmal versucht, einen Quelltext von jQuery zu lesen? das wäre besser. Außerdem haben 90% der Leute, die jQuery auf professionellem Niveau benutzen, keine Ahnung, wie es funktioniert. ;) – deb0rian

+1

Die echte Funktion ist in Zeile 566. – Joe

Antwort

2

Nein, es ist nicht rekursiv. Die Funktion auf line 222 ist die eine auf jQuery-Prototyp ($.fn), während die Funktion, die es aufruft, ist jQuery.each - eine statische Eigenschaft, die in line 566 definiert ist. Beachten Sie, wie extend funktioniert: Wenn kein zu erweiterndes Objekt angegeben wird, verwendet es this. Es wird sowohl auf jQuery als auch auf jQuery.fn in verschiedenen Abschnitten des Codes angewendet.

also wie funktioniert das genau?

$obj.each(callback) ruft die $.fn.each-Methode, die auf der $.each jQuery Instanz (DOM wrapper) selbst gilt: line 223.

Jetzt, in $.each, gibt es vier Fälle: Mit oder ohne args Array geliefert, und auf einer Array-ähnlichen Struktur oder auf anderen Objekten. Sie haben keine zusätzlichen Argumente übergeben, und jQuery-Instanzen haben eine length-Eigenschaft und die DOM-Elemente in numerischen Indizes, sodass die Schleife in line 596 ausgeführt wird. So ist Ihr Anruf entspricht

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

Danke - es war besonders hilfreich, dass du aufgeklärt hast welche Funktion was war und was genau die extend() Methode macht. Es ist eine Schande, dass dieser Thread geschlossen wurde - ich habe das Gefühl, dass mehr jQuery-Benutzer die Innereien verstehen könnten. Die einzige Sache, die mich immer noch verwirrt, ist die Art und Weise, wie die Iteration abläuft. Wenn ich beispielsweise ein Array von drei Elementen zur Verfügung stelle, wie wird dieses Array in die einzelnen Funktionen gebracht, wenn es nicht wirklich ein Argument ist? – netpoetica

+0

Es ist das erste Argument von '$ .each' -' obj'. Wenn Sie '$ .fn.each' verwenden, wird die Array-ähnliche jQuery-Instanz selbst (' this') übergeben. – Bergi

2

Soweit ich weiß, dieses

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

ist das Äquivalent, dies zu tun:

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

Die Aufgabe wird durch ein $ Auswahl zurückgegeben wird, ist tatsächlich ein Array von DOM-Elemente mit ein eine ganze Reihe zusätzlicher Methoden, die damit verbunden sind, so dass Sie im Prinzip damit arbeiten können, wie Sie es mit einem Array tun würden. Hoffnung, die Dinge aufräumt!

+2

Genau genommen ist es gleichbedeutend mit 'func.call ($ selector [i], i, $ selector [i]);'. –

+0

Danke dafür Felix, du hast Recht. – LukeGT

0

Jede Abfrage, die Sie in jQuery tun wird als ein Array wie Objekt gespeichert, dh Sie können die Liste der DOM-Elemente zugreifen können Ihre Abfrage, indem Sie diese gefunden hat:

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

Intern verwendet $() jeweils $ .each, was eine Möglichkeit ist, durch Ihre Sammlung zu iterieren, die Funktion aufzurufen, die Sie als Argument übergeben haben, und 'Function.apply' zu verwenden, um 'this' als aktuell zu definieren Objekt wird durchlaufen.

0

Check out Linien 566-605 in the source

Es ist iterativ und recht unkompliziert.