2013-02-22 18 views
6

çizgi kütüphanesinin kaynak koduna kazma, ben o _.each bulunan her edilebilen bir ECMAScript 5 API Array.forEach dayanır: Fark ettimjQuery.each neden kullanılabilir olduğunda Array.forEach güvenmiyor bir nedeni var mı?

var each = _.each = _.forEach = function(obj, iterator, context) { 
    if (obj == null) return; 
    if (nativeForEach && obj.forEach === nativeForEach) { 
     obj.forEach(iterator, context); 
    } else if (obj.length === +obj.length) { 
     for (var i = 0, l = obj.length; i < l; i++) { 
      if (iterator.call(context, obj[i], i, obj) === breaker) { 
       return; 
      } 
     } 
    } else { 
     for (var key in obj) { 
      if (_.has(obj, key)) { 
       if (iterator.call(context, obj[key], key, obj) === breaker) { 
        return; 
       } 
      } 
     } 
    } 
}; 

o jQuery.each (statik bir değil, bir ait .each yöntem jQuery sarıcı), forEach'un kullanılabilir olup olmadığına bakılmaksızın, sadece geri arama işlevini çağıran geleneksel bir for yapar. Özlediğim bir sebep var mı?

+2

jQuery bir nesne değil, bir dizidir. Array yöntemini kullanmak için jQuery çağrısını zincirleyebilmek için bir dizi ile nodeList benzeri nesne arasında ileri ve geri dönüş yapmanız gerekir. – kennebec

+0

@kennebec $ .each(), not .each() hakkında konuşuyorum. Soruyu daha açık hale getirmek için düzenledim. –

+0

Olası bir açıklama, jQuery'nin '.each()' işlevinin '.forEach 'ile tam olarak aynı arayüze sahip olmamasıdır, böylece ikisi birbirinin yerine kullanılamaz. JQuery uygulamasının ilk olarak uygulanması durumunda, mevcut olduğunda .forEach'i kullanmak için API'lerini kırmaları/değiştirmeleri gerekir. – jfriend00

cevap

1

Muhtemelen bu ikisi uygulamada farklılık gösterdiği için - Array.forEach, dizi öğesini ilk parametre olarak ve ikinci olarak dizin olarak geçirir. jQuery.each dizini önce gönderir, dizi elemanı gönderir.

Aslında muhtemelen en iyi tartışma kaynak yığın taşması üzerine tam burada:

jQuery.each implementation differs from native Array.forEach

Onların tahminim bu bir hata olduğunu olma - bu yüzden birçok site, jQuery.each uygulanan bu, ilk indeksi bekliyor var Onları mümkün olduğunca tersine çeviremezler.

İlgili konular