2010-05-13 17 views
6

पहला सवाल enclosing में एक चर को संदर्भित करता है :) आशा है मैं अपने आप को शर्मिंदा नहीं होगा ...जावास्क्रिप्ट गुंजाइश समस्या है जब लैम्ब्डा समारोह stackoverflow पर पाश

मैं एक जावास्क्रिप्ट समारोह है कि एलबम की एक सूची लोड और फिर है यह प्रत्येक एल्बम के लिए एक सूची आइटम बनाता है। सूची आइटम क्लिक करने योग्य होना चाहिए, इसलिए मैं एक फ़ंक्शन के साथ jQuery के क्लिक() को कॉल करता हूं जो सामान करता है। मैं इसे एक लूप में करता हूँ। मेरी समस्या यह है कि सभी वस्तुओं को एक ही क्लिक फ़ंक्शन मिलते हैं, भले ही मैं एक नया ऐसा करने की कोशिश करता हूं जो प्रत्येक पुनरावृत्ति में अलग-अलग चीजें करता है। एक और संभावना यह है कि पुनरावृत्ति चर किसी भी तरह वैश्विक है, और समारोह इसे संदर्भित करता है। नीचे कोड डीबग() फायरबग के कंसोल का एक encapsulation है .debug()।

function processAlbumList(data, c) { 
for (var album in data) { 
    var newAlbum = $('<li class="albumLoader">' + data[album].title + '</li>').clone(); 
    var clickAlbum = function() { 
    debug("contents: " + album); 
    }; 
    debug("Album: " + album + "/" + data[album].title); 
    $('.albumlist').append(newAlbum); 
    $(newAlbum).click(clickAlbum); 
} 
} 

यहाँ यह क्या प्रिंट की एक प्रतिलिपि जब ऊपर समारोह, चलाता है कि उसके बाद कुछ डिबग से मुझे अलग आइटम पर क्लिक वजह से लाइनें हैं है। यह हमेशा "10" प्रिंट करता है, जो एल्बम वैरिएबल लेता है (10 एल्बम हैं) का आखिरी मूल्य है।

Album: 0/Live on radio.electro-music.com 
Album: 1/Doodles 
Album: 2/Misc Stuff 
Album: 3/Drawer Collection 
Album: 4/Misc Electronic Stuff 
Album: 5/Odds & Ends 
Album: 6/Tumbler 
Album: 7/Bakelit 32 
Album: 8/Film 
Album: 9/Bakelit 
Album: 10/Slow Zoom/Atomic Heart 
contents: 10 
contents: 10 
contents: 10 
contents: 10 
contents: 10 

कोई विचार? दीवार को मुझे ड्राइविंग, यह है। :)

/स्टीफन

+2

देखें: http://stackoverflow.com/questions/1734749/ http://stackoverflow.com/questions/643542/ http://stackoverflow.com/questions/1582634/ http://stackoverflow.com/questions/1331769/ http://stackoverflow.com/questions/1552941/ http://stackoverflow.com/questions/750486/ http://stackoverflow.com/questions/933343/ http://stackoverflow.com/questions/1579978/ http://stackoverflow.com/questions/14139 16/ – CMS

+0

@ सीएमएस - वाह, क्या आप बस उन्हें इकट्ठा करते हैं? – harpo

+1

@harpo, हाँ, मैं एक ही प्रश्न का जवाब देने के थक गया ... :) – CMS

उत्तर

8

आप इस तरह इस तरह के रूप में, एक और गुंजाइश को पेश करने की जरूरत है:

var clickAlbum = (function (a) { 
    return function() { 
     debug("contents: " + a) 
    }; 
})(album); 
+0

अद्भुत! बहुत बहुत धन्यवाद। मुझे एहसास हुआ कि यह उन बेवकूफ नौसिखियों में से एक था लेकिन मैं पागल हो रहा था ... –

0

अपने भीतर के समारोह में album चर को बंद करने की है, लेकिन अपने मूल्य बाध्य नहीं है जब प्रत्येक समारोह घोषित किया गया है। इसका मतलब है कि प्रत्येक बार लूप के माध्यम से, album बंद होने पर उस लूप में उसके मूल्य में बदल दिया जाएगा। एक और विस्तृत स्पष्टीकरण here

जैसा कि शॉन (और आलेख) सुझाव देता है, आप चर के दायरे को बदलकर इस समस्या को हल कर सकते हैं।

+0

हाँ सीन के सुझाव ने सबकुछ काम किया। मैं वास्तव में फ़ंक्शन में स्थानीय चर (और अन्य पागल प्रयासों के असंख्य) को सामान सौंपकर दायरे को बदलने की कोशिश कर रहा था, लेकिन अब मैं बेहतर जानता हूं। लिंक के लिए धन्यवाद - मैं इसे जांचने जा रहा हूं। –

+0

आपका स्वागत है। चूंकि मूल कारण काफी उन्नत है, इसलिए आपके लिए गहरी समझ प्राप्त करने के लिए पढ़ना उपयोगी हो सकता है ... –

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