2013-02-22 9 views
6

Während in die Quellcode des Unterstrich Bibliothek Graben, ich in diesen _.each stützt sich auf einem ECMAScript 5 API Array.forEach wann immer verfügbar gefunden:Gibt es einen Grund, warum jQuery.each nicht auf Array.forEach angewiesen ist, wenn es verfügbar ist?

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

ich bemerkte, dass jQuery.each (der statische, nicht das .each Verfahren zur Herstellung eines jQuery Wrapper) tut nur eine traditionelle for, die die Callback-Funktion aufruft, egal ob forEach verfügbar ist oder nicht. Gibt es einen Grund dafür, den ich verpasst habe?

+2

jQuery ist ein Objekt, kein Array. Sie müssten zwischen einem Array und dem nodeList-ähnlichen Objekt hin und her konvertieren, um den jQuery-Aufruf zur Verwendung der Array-Methode verketten zu können. – kennebec

+0

@kennebec Ich spreche über $ .Each(), nicht .Each(). Ich habe die Frage bearbeitet, um sie klarer zu machen. –

+0

Eine mögliche Erklärung ist, dass jQuerys '.each()' nicht genau die gleiche Schnittstelle wie '.forEach' hat, so dass die beiden nicht austauschbar sind. Wenn jQuery ihre Implementierung zuerst hatte, dann müssten sie ihre API brechen/ändern, um .forEach zu verwenden, wenn sie vorhanden ist. – jfriend00

Antwort

1

Es ist wahrscheinlich, weil die beiden in der Implementierung unterscheiden - Array.forEach übergibt das Array-Element als erster Parameter und den Index als zweite. jQuery.each übergibt den Index zuerst, das Array-Element sendet.

Eigentlich wahrscheinlich die beste Diskussion Quelle ist hier auf Stapelüberlauf:

jQuery.each implementation differs from native Array.forEach

Ihre Vermutung ist, dass es ein Fehler war - so viele Seiten haben jQuery.each implementiert, zunächst den Index erwartet, dass sie können sie nicht umkehren.