2013-01-16 24 views
8

संभव डुप्लिकेट:
How do JavaScript closures work?ही जे एस बंद पाश मुद्दा - लेकिन इतना के जवाब काम नहीं कर रहे

मैं सभी मिलियन वही पुरानी जावास्क्रिप्ट बंद पाश मुद्दे के डुप्लिकेट पढ़ा है । मैंने सोचा कि मैं उन्हें समझ गया हूं, और आज तक बिना किसी मुद्दे के महीनों के बंद होने का उपयोग कर रहा हूं। मैं फंस गया हूँ

for (var i in groups){ 
    for(var j in groups[i]){ 
     $(unique_form).die('submit').live('submit'), function{ 
      function (groups2, i2, j2){ 
       return function(){alert(groups2[i2][j2])} 
       }(groups, i, j) 
      } 
     }); 
     }    
    } 
} 

जब मैं प्रत्येक अद्वितीय रूप प्रस्तुत करता हूं - मैं समूहों के अंतिम तत्व [i] [j] के लिए अलर्ट प्राप्त करता रहता हूं। जाहिर है, मैं कुछ बेवकूफ कर रहा हूँ, यह क्या है? मैंने सोचा कि अज्ञात फ़ंक्शन समूह 2, i2, और j2 बनाकर मैं समस्या को हल कर रहा था।

+0

क्लोजर ऑब्जेक्ट्स (कम से कम जावास्क्रिप्ट में) के लिए काम नहीं करते हैं क्योंकि ऑब्जेक्ट का केवल संदर्भ संलग्न है। – Niko

+1

आप उस विचित्र कोड के साथ क्या करने की कोशिश कर रहे हैं ?! – gdoron

+0

बंद होने पर ईवेंट हैंडलर के बाहर होना चाहिए ताकि संदर्भ हैंडलर के भीतर संदर्भ मौजूद हों। – Jasper

उत्तर

8

आपके द्वारा .live() पर जाने वाला फ़ंक्शन निष्पादित किया गया है जब सबमिट ईवेंट निकाल दिया गया है। उस बिंदु तक, i और j उनके अंतिम मान होंगे। आप ईवेंट हैंडलर की बाहर बंद बनाना होगा:

(function (i2, j2) { 
    $(unique_form).die('submit').live('submit', function{ 
     alert(groups[i2][j2]) 
    }); 
}(i, j)); 

सूचना है कि मैं गुमनाम समारोह से groups तर्क हटा दिया है। उस पर बंद करने की कोई आवश्यकता नहीं है क्योंकि इसका मूल्य नहीं बदलेगा। मैंने पूरे फ़ंक्शन अभिव्यक्ति को कोष्ठक में भी लपेट लिया है, जो सम्मेलन है (और इस मामले में वास्तव में आवश्यक है, इसे अभिव्यक्ति के रूप में पार्स करने के लिए मजबूर करने के लिए)।

यह भी ध्यान दें कि मैंने आपके प्रश्न में .live() के पहले तर्क के बाद बंद समापन को हटा दिया है। यह वहां नहीं होना चाहिए।


साइड नोट

.live() और .die() अब उम्र के लिए बहिष्कृत कर दिए गए हैं। .on() (jQuery 1.7+ के साथ) या .delegate() (पुराने संस्करणों के साथ) का उपयोग करें।

+0

+1 उस ग़लत कोष्ठक को हटाने के लिए मत भूलना 'live ('submit')' <- –

+0

@wirey - धन्यवाद, अच्छी जगह! –

+0

@ जेम्ससवर्डिस: महान जवाब। – gahooa

-1

for (var i in groups){ 
    for(var j in groups[i]){ 
     $(unique_form).die('submit').live('submit', function(groups2, i2, j2){ 
      return function(){ 
       alert(groups2[i2][j2]) 
      } 
     }(groups, i, j)); 
     }    
    } 
} 
0

आपका कोड groups.length सेट लाइव संचालकों प्रस्तुत चुकता बाहर इस कोशिश करो। जब प्रस्तुत घटना होता है, को लाइव संचालकों के सभी फ़ाइल, प्रत्येक i और j की पिछले मूल्य संदर्भित

function{ 
    function (groups2, i2, j2){ 
     return function(){alert(groups2[i2][j2])} 
    }(groups, i, j) 
} 

: प्रत्येक को लाइव हैंडलर इस समारोह का एक अलग प्रतिलिपि के होते हैं।

यह कहना मुश्किल है कि आप कोड खंड पर आधारित वास्तव में क्या चाहते हैं, अधिक जानकारी के साथ मैं शायद और अधिक मदद कर सकता हूं। सौभाग्य!