OP tarafından belirtildiği gibi, while
koşulundan sonra hiçbir ifade yoktur. While döngüsünden sonra noktalı virgülü not alın, return this
sadece while döngüsü tamamlandıktan sonra çalıştırılır ve bu üç ifadeden herhangi biri false olarak değerlendirilir. Eğer bilmek istediğiniz her şey, while döngüsünün nasıl çalıştığıysa, Filip Bartuzi'nin cevabı muhtemelen en eksiksiz. each2
yönteminin ne yaptığını daha geniş bir yanıt vermeye çalışacağım.
olarak sadece jQuery's #each veya Array.prototype.forEach veya Underscore's #each veya Select2 en kullanımlar için özel olarak tasarlanmıştır lodash's #forEach daha verimli versiyonu, docs kaydetti. Bir jQuery nesnesine sarılmış herhangi bir dizi veya başka yinelenebilir üzerinde yineleme yapmak için kullanılır. Bu yüzden diziler dizileri ve jQuery koleksiyonları için kullanılır.
Çalışma şekli, kapsam() çağrısının yapıldığı dizidir. Argüman olarak bir işlev verilir. Bu, daha önce bahsettiğim diğer each
yöntemlerinin nasıl adlandırıldığıdır. Dizideki her öğe için each2
'a verilen işlev bir kez çağrılır. While döngüsü, dizideki her öğe üzerinde yinelemenin hacky yoludur ve işlevi çağırır, öğeyi bağlam olarak ayarlar ve dizini diziye geçirir ve öğeyi birinci ve ikinci argümanlar olarak jQuery nesnesi olarak geçirir.while
döngü koşulundaki her ifade doğru olup olmadığını belirlemek için değerlendirilmeli ve bu değer değerleri gerçekten değişkenlere atamak için kullanılır ve i
değerini artırır. c.call(j[0], i, j) !== false
bölümü, işlevin false döndürerek döngüyü erken sonlandırmasına izin verir. Eğer işlev false döndürürse, while döngüsü duracaktır, aksi halde i
l
'dan büyük olana kadar devam edecektir, yani dizideki her öğe kullanılmış demektir. Daha sonra this
döndürülmesi, .each2
'dan sonra diziye başka bir yöntemin zincirlenmesine olanak tanır.
Temelde
while
döngü için yazılabilirdi:
var j = $([0]), i = 0, l = this.length, continue = true;
while (i < l) {
i++;
j.context = j[0] = this[i];
continue = c.call(j[0], i, j);
if (!continue) {
break;
}
}
ama bu tarayıcı tarafından hem optimize edilemez neden bazı performans nedenleri muhtemelen vardır.
Normal each
yöntemlerinden daha hassastır. Örneğin, dizideki bir öğenin 0
gibi bir falsey değerine sahip olması durumunda, (j.context = j[0] = this[i])
döngü olacaktır, bu da döngünün sonlandırılmasına neden olur. Ancak, yalnızca select2 kodunun özel durumlarda kullanılır, bunun olmaması gerekir.
Birkaç örnek üzerinden geçelim.
function syncCssClasses(dest, src, adapter) {
var classes, replacements = [], adapted;
classes = $.trim(dest.attr("class"));
if (classes) {
classes = '' + classes; // for IE which returns object
$(classes.split(/\s+/)).each2(function() {
if (this.indexOf("select2-") === 0) {
replacements.push(this);
}
});
}
...
^
Bu kod
dest
DOM öğesinden sınıfları oluyor. Sınıflar bir dizi diziye bölünür (dize boşluk karakterleri üzerine bölünür, bu
\s+
düzenli ifade), her sınıf adı dizideki bir öğedir. Burada özel bir jQuery çalışması gerekmez, bu nedenle
each2
tarafından çağrılan fonksiyonun sağlandığı 2 argüman kullanılmaz. Eğer sınıf 'select2-' ile başlarsa, sınıf
replacements
adında bir diziye eklenir. 'Select2-' sınıfları kopyalanıyor, oldukça basit.
group.children=[];
$(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
^kısalık için ben bu yöntemin kalanını dahil değil ama process
yöntemin bir parçasıdır. Bu durumda,, bir düğümde ve tüm bu çocuklar için tekrarlı olarak process
kullanılıyor. $(datum.children)
jQuery seçimi, her 'child' (childDatum
olarak adlandırılır) sırayla işlenir ve çocuklar aynı işlemden geçirilir. group.children
dizisi bir koleksiyon olarak kullanılacaktır, her childDatum
için bu diziye eklenenler kullanılabilir olacaktır, böylece each2
çalıştırıldıktan sonra tüm çocukların, torunların vb. Işlemleri sırasında eklenen her şeyi tutacaktır.
Cevapları gözden geçirme şansınız oldu mu? Bu bir satır çözümü olmadığı için bir yorum bırakın ve eğer açık değilse, açıklık gerektirir. –