2013-02-22 10 views
6

Mentre scavare nel codice sorgente della libreria sottolineatura, ho trovato su che _.each si basa su un ECMAScript 5 API Array.forEach ogniqualvolta disponibili:C'è un motivo per cui jQuery.each non si basa su Array.forEach quando è disponibile?

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

ho notato che jQuery.each (quello statico, non il metodo di una .each jQuery wrapper) fa solo un tradizionale for che chiama la funzione di callback, non importa se forEach è disponibile o meno. C'è una ragione per quello che ho perso?

+2

jQuery è un oggetto, non un array. Dovresti convertire avanti e indietro tra un array e l'oggetto nodeList-like per essere in grado di concatenare la chiamata jQuery per utilizzare il metodo Array. – kennebec

+0

@kennebec Sto parlando di $ .each(), non .each(). Ho modificato la domanda per renderla più chiara. –

+0

Una possibile spiegazione è che '.each()' di jQuery non ha esattamente la stessa interfaccia di '.forEach', quindi i due non sono intercambiabili. Se jQuery avesse prima implementato la propria implementazione, avrebbe dovuto interrompere/modificare la propria API per poter utilizzare .for Anyach when present. – jfriend00

risposta

1

È probabilmente perché i due differiscono nell'implementazione: Array.forEach passa l'elemento array come primo parametro e l'indice come secondo. jQuery.each passa prima l'indice, l'elemento dell'array invia.

In realtà probabilmente la migliore fonte di discussione è proprio qui su Stack Overflow:

jQuery.each implementation differs from native Array.forEach

La loro ipotesi è che sia stato un errore - così tanti siti hanno implementato jQuery.each, aspettandosi l'indice prima, che non possono invertire fattibile.

Problemi correlati