2013-02-22 19 views
6

Podczas kopania w kodzie źródłowym biblioteki podkreślenia, znalazłem w tym _.each opiera się na ECMAScript 5 API Array.forEach ilekroć dostępnych:Czy istnieje powód, dla którego jQuery.each nie bazuje na Array.forEach, jeśli jest dostępny?

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; 
       } 
      } 
     } 
    } 
}; 

zauważyłem, że jQuery.each (statyczny jeden, nie sposób .each jQuery wrapper) działa tylko tradycyjnie for, który wywołuje funkcję zwrotną, niezależnie od tego, czy jest dostępna wersja forEach. Czy jest jakiś powód, dla którego tęskniłem?

+2

jQuery to obiekt, a nie tablica. Konieczna byłaby konwersja między tablicą a obiektem typu nodeList, aby móc łączyć wywołanie jQuery z użyciem metody Array. – kennebec

+0

@kennebec Mówię o $ .each(), nie .each(). Zmieniłem to pytanie, aby było bardziej zrozumiałe. –

+0

Jednym z możliwych wyjaśnień jest to, że '.each()' jQuery nie ma dokładnie tego samego interfejsu co '.forEach', więc nie można ich używać zamiennie. Jeśli jQuery ma swoją implementację jako pierwszą, musieliby złamać/zmienić swój interfejs API, aby użyć .forEach, gdy jest obecny. – jfriend00

Odpowiedz

1

Prawdopodobnie dlatego, że dwa różnią się implementacją - Array.forEach przekazuje element tablicy jako pierwszy parametr, a indeks jako drugi. jQuery.each przekazuje najpierw indeks, a element tablicy wysyła.

Właściwie prawdopodobnie najlepszym źródłem dyskusja jest tutaj na przepełnienie stosu:

jQuery.each implementation differs from native Array.forEach

Ich przypuszczenie jest, że to była pomyłka - tak wiele stron wdrożyliśmy jQuery.each, oczekując indeks pierwsze, że nie mogą ich odwrócić.