2012-07-22 20 views
14

的我正在研究UnderscoreJS如何實現他們的each/forEach下劃線的每個檢查{}返回回調

//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) 

基本上,它執行的對象/數組中的每一項回調。但是,這就像讓我困惑

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

從我的理解,如果回調返回一個對象,循環中斷,但是...... 爲什麼它是比較breaker這是下劃線模塊中的內部對象?。它不是一直評估爲false,因爲即使回調確實返回一個對象,它始終是false,因爲它不是同一個對象(因此循環從不會中斷)。這背後的原因是什麼?

+0

我喜歡的另一個技巧是,如果您需要爲斷路器對象添加值,則需要創建斷路器類並使用instanceof測試。 – hugomg 2012-07-22 13:52:42

回答

13

它們在內部使用each,例如, some。由於some確實短路,因此他們可以使用「祕密」對象在那裏打破each,而不會爲常規用戶公開此功能。他們不公開中斷功能,因爲本機功能不會這樣做(因此他們的墊片儘可能像本機一樣)。如果他們這樣做了,中斷功能只有在本地功能不可用時纔可用,這不是特別有用。