2010-04-30 10 views
6

(करने के लिए jQuery उपयोगिता समारोह jQuery.data) ऑनलाइन प्रलेखन के बारे में कहते हैं:मेमोरी लीक को रोकने के लिए jQuery का .data() फ़ंक्शन बेहतर क्यों है?

"jQuery.data() विधि को डोम के लिए किसी भी प्रकार की डेटा देते हैं एक तरीका है कि सुरक्षित है में तत्वों की अनुमति देता है । वृत्तीय संदर्भ और इसलिए मेमोरी लीक से से "

उपयोग करने के लिए क्यों:

document.body.foo = 52; 

एक स्मृति रिसाव -या क्या शर्तों में परिणाम ताकि मैं

jQuery.data(document.body, 'foo', 52); 

) का उपयोग करना चाहिए मैं हमेशा .data (पसंद करते हैं चाहिए किसी भी मामले में expandos उपयोग करने के बजाय कर सकते हैं?

(मैं सराहना करता है, तो आप मतभेदों की तुलना करने के लिए एक उदाहरण प्रदान कर सकते हैं होगा)

धन्यवाद,

बुराक ozdogan

+1

http://stackoverflow.com/questions/1056098/what-sort-of-memory-leaks-should-i-watch-for- jquerys-data आपके प्रश्न का उत्तर देते हैं? – Konerak

+0

मुझे लगता है? आईई एक दशक के लिए इस बुराई का सामना करना पड़ता है। लेकिन AFAIK यह तब होता है जब आप किसी DOM तत्व को हटा/अलग करते हैं जबकि ईवेंट हैंडलर अभी भी सेट होते हैं। – jweyrich

+0

@jweyrich: जबकि आईई मेमोरी लीकिंग के लिए कुख्यात प्रसिद्ध है, अन्य ब्राउज़र इसके प्रति प्रतिरोधी नहीं हैं। –

उत्तर

6

आपके द्वारा दिए गए उद्धरण में कुछ ऐसा कहने के कारण यह बेहतर है: "परिपत्र संदर्भ से सुरक्षित।"

कहें कि आपके पास nodeOne और nodeTwo वेरिएबल हैं, जो संदर्भ नोड्स हैं।

कहो आप तो एक समारोह (जिसका संदर्भ आप की दुकान नहीं है) में रखते: समारोह चलाता

jQuery.data(nodeOne, 'item', nodeTwo); 
jQuery.data(nodetwo, 'item', nodeOne); 

के बाद, वहाँ एक परिपत्र संदर्भ है: nodeOne nodeTwo करने के लिए एक रेफरी है, और इसके विपरीत।

jQuery.data का उपयोग करके, वह परिपत्र संदर्भ उन दो चर को एकत्रित कचरे से नहीं रोकेगा।

हालांकि, अगर आप jQuery.data का उपयोग कर एक ही बात है, लेकिन ऐसा करने के लिए थे बिना, nodeOne और nodeTwo चर कचरा एकत्र नहीं किया जाएगा, भले ही चर अब जरूरत नहीं है।

-

मैं हमेशा .data() के बजाय किसी भी मामले में expandos का उपयोग करने का पसंद करते हैं चाहिए?

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

+0

मजेदार, यह ड्राइव-डाउनवॉट था। – fig

+0

रुको, क्या आपका कोड नमूना है कि jQuery का '.data() 'करता है या' nodeOne' और 'nodeTwo' को कचरा नहीं मिलता है? –

+0

@ क्रिसेंट ताजा, अच्छा बिंदु, मैं यह स्पष्ट कर दूंगा। – fig

4

मैं बहुत यकीन है कि आप एक साथ एक स्मृति रिसाव को पेश नहीं कर सकते आदिम मूल्य 52। विस्तार के साथ मेमोरी लीक आमतौर पर तब होती है जब कोई मान लागू होता है जिसमें तत्व के संदर्भ में एक ऑब्जेक्ट होता है।

मैं http://msdn.microsoft.com/en-us/library/Bb250448 पर परिपत्र संदर्भ शीर्षक की सामग्री पढ़ने का सुझाव देता हूं। इससे भी बेहतर, इसे सभी पढ़ें :-)

ऐसा कहा जा रहा है कि, मुझे लगता है कि अधिकांश लोग संभव होने पर विस्तार का उपयोग करने की सलाह देते हैं (और यह आमतौर पर संभव है)। किसी भी मामले में jQuery के data() का उपयोग करना एक अच्छा विकल्प है।


बस एहसास हुआ कि मैंने आपके प्रश्न का उत्तर नहीं दिया है। ,

  1. jQuery डेटा
  2. डेटा एक वस्तु data() विधि करने के लिए उपलब्ध में संग्रहित है के लिए एक अद्वितीय ID गणना करता है अद्वितीय ID
  3. एक का उपयोग कर: jQuery के data() एक विधि है जो निम्न की तरह कुछ चला जाता है प्रदान करता है expando संपत्ति एक आदिम मूल्य

जब भी आप data() फोन डेटा लाने के रूप में अनन्य आईडी से तत्व को लागू किया जाता है, jQuery अद्वितीय ID के लिए expando संपत्ति तक पहुँचता है और उस आईडी डेटा प्राप्त करने का उपयोग करता है कैशिंग ऑब्जेक्ट से। चूंकि विस्तार में एक आदिम मान होता है और कैशिंग ऑब्जेक्ट से कोई अनुलग्नक नहीं होता है, इसलिए कोई परिपत्र संदर्भ नहीं होता है।

+0

धन्यवाद एंडी ई हेड (यह फ़ुतुरामा से कुछ दिखता है! :)) आपके द्वारा प्रदान की गई बहुत उपयोगी जानकारी। – pencilCake

+0

@burak: मैं एक बड़ा फ़्यूचुरमा प्रशंसक हूं :-) –

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