2010-01-18 11 views
5

मुझे कुछ 30-40 गुणों के साथ एक जावास्क्रिप्ट ऑब्जेक्ट बनाए रखना है, जिसे मैं हर कुछ सेकंड अपडेट करता हूं। मैंने पढ़ा है कि जावास्क्रिप्ट में "फ्रीिंग" मेमोरी जैसी कोई चीज़ नहीं है, और ब्राउज़र स्वचालित रूप से कचरा अप्रयुक्त स्मृति एकत्र करता है।जावास्क्रिप्ट ऑब्जेक्ट्स: उन्हें नष्ट करना

मेरा प्रश्न है: क्या ऑब्जेक्ट को शून्य पर सेट करने के लिए पर्याप्त है, या क्या मुझे अपनी सभी गुणों को शून्य पर सेट करने की आवश्यकता है और फिर इसे शून्य पर सेट करना है?

var obj = []; 
obj[prop1] = "123"; 
obj[prop2] = "456"; 
//...and so on... 

// now to release the obj, is it enough if I just did: 
obj = null; 
+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection – Eineki

उत्तर

1

एक वस्तु ही अगर यह अब पहुंचा जा सकता है एकत्र किया जा सकता। आप ऑब्जेक्ट को null (किसी अन्य मूल्य के साथ-साथ) को संदर्भित करने और अन्य ऑब्जेक्ट्स के किसी भी गुण को हटाने (या ओवरराइटिंग) को संदर्भित करने वाले सभी स्थानीय चर सेट करके इसे प्राप्त कर सकते हैं।

ऑब्जेक्ट की अपनी संपत्तियों को हटाने या उन्हें स्पष्ट रूप से null पर सेट करने से आपको इस संबंध में कुछ भी लाभ नहीं मिलेगा: ऑब्जेक्ट के संदर्भों को 'जीवित' नहीं माना जाएगा यदि स्वयं नहीं है।

+0

में एक वाक्यविन्यास त्रुटि भी सही है! धन्यवाद! – Dmitry

0

गुणों को शून्य पर सेट करना अनावश्यक है। गुणों में संग्रहीत कोई भी मूल्य कचरा कलेक्टर द्वारा मुक्त किया जाएगा। वैकल्पिक रूप से, delete ऑपरेटर की संभावना तत्काल विनाश के लिए बाध्य करेगा:

delete obj; 
+2

'हटाएं' ऑब्जेक्ट विनाश को मजबूर नहीं करता है - यह वस्तुओं से गुणों को हटा देता है; भी, स्थानीय चर हटाया नहीं जा सकता है; ऐसा करने से सख्त-मोड ECMAScript 5 – Christoph

1

एकमात्र बार (मैं सोच सकता हूं) जहां आपको null पर आइटम सेट करने की आवश्यकता होगी, कुछ ऐसे मामले हैं जहां डोम शामिल है।

उदाहरण के लिए, यदि आपके पास अज्ञात कार्यों द्वारा परिभाषित एक ऑनक्लिक हैंडलर के साथ कई बच्चे नोड्स के साथ नोड है, तो प्रत्येक ऑनक्लिक को null पर सेट करना एक अच्छा विचार होगा (अनजाने परिपत्र संदर्भों से बचने के लिए)।

<div id="delete_me"> 
    <span></span> 
    <span></span> 
</div> 

var theDiv = document.getElementById('delete_me'); 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = function() { 
    // stuff 
    }; 
} 

// Later... 
// Delete stuff. 
var divToDelete = document.getElementById('delete_me'); 

// Remove all the onclicks 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = null; 
} 

// Delete the div 
divToDelete.parentNode.removeChild(divToDelete); 
2

वेरिएबल्स तब तक कचरा नहीं एकत्र किए जाते हैं जब तक कम से कम एक संदर्भ न हो। हालांकि, ध्यान रखें कि वैश्विक चर "हर जगह" से दिखाई दे रहे हैं और कभी-कभी कचरा इकट्ठा नहीं किया जा सकता है, क्योंकि वे अभी भी कहीं से दिखाई दे रहे हैं।

उदाहरण के लिए, आप

इसलिए, मैं null के लिए मूल्य निर्धारित करने के बाद आप अपने उद्देश्य के साथ किया जाता है करने के लिए सहमति होता है।

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