ऐसा इसलिए किया गया है क्योंकि जावास्क्रिप्ट में केवल फ़ंक्शन स्कोप है, ब्लॉक दायरा नहीं है। इसलिए, आपके द्वारा लूप में घोषित प्रत्येक वैरिएबल फ़ंक्शन के दायरे में है और आपके द्वारा बनाए गए प्रत्येक बंद होने पर एक ही चर के लिए उपयोग होता है।
तो एक ही तरीका है एक नया गुंजाइश बनाने के लिए एक समारोह कॉल करने के लिए है और वह है क्या
(function(i){/* Some code using i */}(i))
कर रहा है।
ध्यान रखें कि आपके उदाहरण एक महत्वपूर्ण हिस्सा याद करते हैं:
someArray[i].onclick = (function(i){
return function() {
/* Some code using i */
}
}(i));
तत्काल समारोह कुछ खास नहीं है: तत्काल समारोह एक और समारोह जो click
हैंडलर हो जाएगा वापस जाने के लिए है। यह किसी भी तरह फ़ंक्शन परिभाषा और फ़ंक्शन कॉल को रेखांकित करता है। आप इसे सामान्य फ़ंक्शन कॉल द्वारा प्रतिस्थापित कर सकते हैं:
function getClickHandler(i) {
return function() {
/* Some code using i */
}
}
for(var i=0; i < someArray.length; i++){
someArray[i].onclick = getClickHandler(i);
}
स्रोत
2011-01-23 22:00:18
इस तकनीकी रूप से बंद होने में शामिल नहीं है। हालांकि मुझे पूरा यकीन नहीं है कि यह कितना अच्छा करता है; वह आंतरिक कार्य तुरंत चलाएगा, और जब तक कि यह कोई अन्य कार्य नहीं करेगा, तो ऑनक्लिक वास्तव में कुछ अजीब पर सेट हो जाएगा। – cHao
@cHao इस तत्काल अज्ञात फ़ंक्शन कॉल के बाद, onlick लिए, यह एक समारोह लौटना चाहिए, ताकि लौटे समारोह के साथ "मैं" पर्यावरण आसपास में चर एक बंद है सौंपते हैं। – jcubic
@jcubic: * कोड वास्तव में एक डोम ईवेंट हैंडलर * स्थापित कर रही है, यह एक समारोह * लौटना चाहिए अगर इसे सही ढंग से काम कर रहा है *। धारणा को औचित्य देने के लिए यहां पर्याप्त कोड नहीं है। – cHao