2013-02-22 12 views
6

Trong khi đào vào mã nguồn của thư viện gạch, tôi thấy ở _.each dựa trên ECMAScript 5 API Array.forEach bất cứ khi nào có sẵn:Có lý do gì khiến jQuery.each không dựa vào Array.forEach khi có sẵn không?

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

tôi nhận thấy rằng jQuery.each (một trong những tĩnh, không phải là .each phương pháp của một jQuery wrapper) không chỉ là một for truyền thống gọi các chức năng gọi lại, không có vấn đề nếu forEach có sẵn hay không. Có lý do nào khiến tôi bỏ lỡ không?

+2

jQuery là một đối tượng chứ không phải mảng. Bạn sẽ phải chuyển đổi qua lại giữa một mảng và đối tượng giống như nodeList để có thể kết nối cuộc gọi jQuery để sử dụng phương thức Array. – kennebec

+0

@kennebec Tôi đang nói về $ .each(), chứ không phải .each(). Tôi đã chỉnh sửa câu hỏi để làm rõ hơn. –

+0

Một giải thích có thể là jQuery '.each()' không có giao diện giống hệt '.forEach' vì vậy cả hai không thể hoán đổi cho nhau. Nếu jQuery đã thực hiện đầu tiên của họ, sau đó họ sẽ phải phá vỡ/thay đổi API của họ để sử dụng .forEach khi có mặt. – jfriend00

Trả lời

1

Có thể do hai sự khác biệt trong triển khai - Array.forEach chuyển phần tử mảng làm tham số đầu tiên và chỉ mục làm tham số thứ hai. jQuery.each vượt qua chỉ mục đầu tiên, phần tử mảng gửi đi.

Trên thực tế có lẽ là nguồn thảo luận tốt nhất là ngay tại đây trên stack overflow:

jQuery.each implementation differs from native Array.forEach

đoán của họ là rằng nó là một sai lầm - vì vậy nhiều trang web đã thực hiện jQuery.each, mong các chỉ số đầu tiên, mà họ không thể đảo ngược chúng.