2012-07-22 13 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

एक और चाल जिसे मैं पसंद करता हूं, यदि आपको ब्रेकर ऑब्जेक्ट्स में मूल्य जोड़ने की आवश्यकता है तो इसके बजाय ब्रेकर क्लास बनाएं और उदाहरणों का परीक्षण करें। – hugomg

उत्तर

13

वे each आंतरिक रूप से उदाहरण के लिए उपयोग करते हैं। some। चूंकि some शॉर्ट-सर्किट करता है, इसलिए नियमित उपयोगकर्ताओं के लिए इस सुविधा को उजागर करते समय, "गुप्त" ऑब्जेक्ट का उपयोग करके each ब्रेक हो सकता है। वे ब्रेक फीचर का पर्दाफाश नहीं करते हैं क्योंकि मूल कार्य ऐसा नहीं करता है, या तो (इसलिए उनका शिम जितना संभव हो उतना देशी है)। यदि उन्होंने किया, तो ब्रेक सुविधा केवल तभी उपलब्ध होगी जब मूल कार्य अनजान है, जो विशेष रूप से सहायक नहीं है।

संबंधित मुद्दे