2012-07-22 13 views
14

Tôi đã kiểm tra như thế nào UnderscoreJS thực hiện của họ each/forEachgạch của mỗi kiểm tra cho {} trở lại của callback

//somewhere up top: 
var breaker = {}; 

//then the each function 
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; 
      } 
     } 
    } 
}; 

//iterator = callback 
//context = optional third parameter of each to provide context in the callback 
//obj  = the list 
//key  = key of the object (i for index when an array) 

Về cơ bản, nó thực hiện các cuộc gọi lại cho từng hạng mục trong đối tượng/mảng. Nhưng như thế này confuses me

if (iterator.call(context, obj[key], key, obj) === breaker) return; 

Từ những gì tôi hiểu, nếu gọi lại trả về một đối tượng, phá vỡ vòng lặp, nhưng ... Tại sao nó so với breaker mà là một đối tượng bên trong module gạch?. Nó không phải là đánh giá để false tất cả các thời gian kể từ khi, ngay cả khi gọi lại không trả lại một đối tượng, nó luôn luôn là false vì nó không phải là cùng một đối tượng (do đó vòng lặp không bao giờ vi phạm). Lý do đằng sau điều này là gì?

+0

Một mẹo khác mà tôi thích, nếu bạn cần thêm giá trị cho các đối tượng ngắt là thay vào đó hãy tạo một lớp Breaker và sử dụng các kiểm thử instanceof. – hugomg

Trả lời

13

Họ sử dụng each nội bộ cho ví dụ: some. Vì some không đoản mạch, chúng có thể có each ngắt bằng cách sử dụng đối tượng "bí mật", trong khi không hiển thị đối tượng địa lý này cho người dùng thông thường. Chúng không tiết lộ tính năng ngắt vì hàm gốc không làm điều đó, hoặc (do đó shim của chúng giống như bản địa càng tốt). Nếu họ đã làm, các tính năng phá vỡ sẽ chỉ có sẵn nếu các chức năng bản địa là unavailble, mà không phải là đặc biệt hữu ích.