ओपी द्वारा नोट किया गया है, while
स्थिति के बाद कोई विवरण नहीं है। थोड़ी देर के बाद अर्धविराम नोट करें, return this
केवल लूप पूरा होने के बाद ही चलाया जाता है, और यह तब होता है जब तीन में से कोई भी कथन गलत साबित होता है। यदि आप सभी जानना चाहते हैं कि टाइम लूप कैसे काम कर रहा है, तो फिलिप बार्टुजी का जवाब शायद सबसे पूरा है। मैं each2
विधि के अनुसार एक व्यापक उत्तर देने का प्रयास करूंगा।
के रूप में किए गए दस्तावेज़ों में बताया गया है, यह सिर्फ jQuery's #each, या Array.prototype.forEach या Underscore's #each या lodash's #forEach कि Select2 के उपयोग के लिए विशेष रूप से डिजाइन किया गया है के लिए एक अधिक कुशल संस्करण है। इसका उपयोग किसी भी ऑब्जेक्ट या अन्य पुनरावर्तनीय पर एक jQuery ऑब्जेक्ट में लपेटने के लिए किया जाता है। तो यह स्ट्रिंग्स के साथ-साथ jQuery संग्रह के सरणी के लिए भी प्रयोग किया जाता है।
जिस तरह से यह काम करता है वह दायरा है (this
) वह सरणी है जिसे इसे कॉल किया गया था। इसे एक तर्क के रूप में एक समारोह दिया जाता है। यह ठीक है कि मैंने पहले उल्लेख किए गए अन्य each
विधियों को कैसे कहा जाता है। each2
को प्रदान किया गया फ़ंक्शन सरणी में प्रत्येक आइटम के लिए एक बार कहा जाता है। जबकि लूप सरणी में प्रत्येक आइटम पर पुनरावृत्ति करने के लिए एक हैकी तरीका है, और फ़ंक्शन को कॉल करें, आइटम को संदर्भ के रूप में सेट करें और सरणी में अनुक्रमणिका को पास करें और आइटम को jQuery ऑब्जेक्ट के रूप में पहले और दूसरे तर्क के रूप में पास करें।while
लूप स्थिति में प्रत्येक कथन का मूल्यांकन यह निर्धारित करने के लिए किया जाना चाहिए कि यह सत्य है या नहीं, और यह प्रक्रिया वास्तव में चरों को मान असाइन करने और i
बढ़ाने के लिए उपयोग की जा रही है। c.call(j[0], i, j) !== false
भाग फ़ंक्शन को झूठी लौटकर प्रारंभिक रूप से लूप को समाप्त करने की अनुमति देता है। यदि फ़ंक्शन गलत लौटाता है, तो जबकि लूप रुक जाएगा, अन्यथा यह i
l
से अधिक होने तक जारी रहेगा, जिसका अर्थ है कि सरणी में प्रत्येक आइटम का उपयोग किया गया है। लौटने के बाद .each2
के बाद सरणी में एक और विधि को जंजीर करने के लिए सक्षम बनाता है।
मूल रूप से while
पाश करने के लिए फिर से लिखा जा सकता है:
var j = $([0]), i = 0, l = this.length, continue = true;
while (i < l) {
i++;
j.context = j[0] = this[i];
continue = c.call(j[0], i, j);
if (!continue) {
break;
}
}
लेकिन वहाँ शायद कुछ प्रदर्शन कारण है कि ब्राउज़र द्वारा रूप में अच्छी तरह से अनुकूलित नहीं किया जा सकता है।
यह सामान्य each
विधियों की तुलना में अधिक नाजुक है। उदाहरण के लिए यदि सरणी में एक तत्व का झूठा मान है जैसे कि 0
, (j.context = j[0] = this[i])
गलत होगा, जिससे लूप समाप्त हो जाएगा। लेकिन इसका उपयोग केवल चयन 2 कोड के विशेष मामलों में किया जाता है, जहां ऐसा नहीं होना चाहिए।
चलो कुछ उदाहरणों के माध्यम से चलते हैं।
function syncCssClasses(dest, src, adapter) {
var classes, replacements = [], adapted;
classes = $.trim(dest.attr("class"));
if (classes) {
classes = '' + classes; // for IE which returns object
$(classes.split(/\s+/)).each2(function() {
if (this.indexOf("select2-") === 0) {
replacements.push(this);
}
});
}
...
^यह कोड एक dest
DOM एलीमेंट से कक्षाएं हो रही है। कक्षाओं को तारों की एक सरणी में विभाजित किया जाता है (स्ट्रिंग को व्हाइटस्पेस वर्णों पर विभाजित किया जा रहा है, यह \s+
नियमित अभिव्यक्ति है), प्रत्येक वर्ग का नाम सरणी में एक आइटम है। यहां कोई विशेष jQuery काम की आवश्यकता नहीं है, इसलिए 2 तर्क जो each2
द्वारा बुलाए गए फ़ंक्शन का उपयोग नहीं किया जाता है। यदि वर्ग 'select2-' से शुरू होता है तो कक्षा को replacements
नामक सरणी में जोड़ा जाता है। 'चयन 2-' वर्गों की प्रतिलिपि बनाई जा रही है, बहुत सरल।
group.children=[];
$(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
^संक्षिप्तता के लिए मैं इस विधि के बाकी शामिल नहीं किया है, लेकिन यह process
विधि का हिस्सा है। इस मामले में, each2
का उपयोग process
एक नोड और उसके सभी बच्चों के लिए किया जा रहा है। $(datum.children)
एक jQuery चयन है, प्रत्येक 'बच्चा' (नाम childDatum
) बदले में संसाधित किया जाएगा, और यह बच्चे एक ही प्रक्रिया के माध्यम से चले जाएंगे। group.children
सरणी को संग्रह के रूप में उपयोग किया जाएगा, जो प्रत्येक childDatum
के लिए उस सरणी में जो भी जोड़ा जाता है, उपलब्ध होगा, इसलिए each2
चलाए जाने के बाद यह सभी बच्चों, पोते, आदि के प्रसंस्करण के दौरान जो कुछ भी जोड़ा गया है, उसे रखेगा
क्या आपको उत्तर की समीक्षा करने का मौका मिला था? एक टिप्पणी छोड़ दो क्योंकि यह एक लाइन समाधान नहीं है और यदि यह स्पष्ट नहीं है तो उसे स्पष्टीकरण की आवश्यकता है। –