2009-12-04 11 views
32

आप की तरह एक समारोह के भीतर एक तत्व बनाते हैं:जावास्क्रिप्ट: document.createElement ('') और हटाना DOMElement

function makeDomElement() 
{ 
    var createdElement = document.createElement('textarea'); 
} 

और तुम डोम यानी के माध्यम से .appendChild कार्यों में कहीं भी संलग्न नहीं है, यह करता है अभी भी स्मृति में रहते हैं? तो तुम

function makeDomElement() 
{ 
    var createdElement = document.createElement('textarea'); 
    delete createdElement; 
} 

मैं सिर्फ उत्सुक :)

+11

इसे फ़ंक्शन के दायरे में किसी अन्य चर के साथ साफ़ किया जाना चाहिए। – Rob

+1

@Rob - यह एक उत्तर होना चाहिए :) – Quentin

उत्तर

26

यह जावास्क्रिप्ट delete कीवर्ड डोम के createElement विधि के साथ कोई संबंध नहीं है तथापि ब्राउज़र को ब्राउज़र से अलग अलग होंगे हूँ करने के लिए होगा। delete का उपयोग करने की कोई आवश्यकता नहीं है।

क्या होगा कि वर्तमान में createdElement में आयोजित तत्व के संदर्भ में कचरा एकत्रित होगा। अब आईई के मामले में इसका अर्थ यह होगा कि तत्व का संदर्भ गणना 0 तक गिर जाएगी, इसलिए यह स्वयं को नष्ट कर देगा और इसकी याददाश्त जारी करेगा। अन्य ब्राउज़र अलग-अलग चीजें करते हैं आम तौर पर डीओएम में तत्व स्वयं कचरा एकत्रित वस्तुओं होते हैं और उसी (या शायद एक डीओएम विशिष्ट) जीसी चक्र के दौरान हटा दिए जाएंगे।

यदि दस्तावेज़ में तत्व जोड़ा गया था तो आईई के मामले में तत्व में एक और संदर्भ जोड़ा जाएगा, इसलिए createdElement में संदर्भ हटा दिया गया है तत्व ऑब्जेक्ट में अभी भी एक गैर-शून्य संदर्भ गणना होगी और जारी रहेगी मौजूद।

अन्य ब्राउज़रों के मामले में जहां तत्व खुद को कचरा इकट्ठा करते हैं, तत्व एकत्र नहीं किया जाएगा क्योंकि संग्राहक इसे दस्तावेज़ से जुड़े ऑब्जेक्ट्स के ग्राफ में देखेगा।

+1

इसके अलावा, यदि बनाया गया तत्व का जिक्र करते हुए 'createElement' के बाद कोई फ़ंक्शन स्टेटमेंट दिखाई देना था, तो यह तत्व के चारों ओर एक बंद कर देगा। तत्व का कचरा संग्रह तब 'दस्तावेज़' में सम्मिलन के साथ या बिना एकत्र किए गए कचरे के रूप में कार्य पर निर्भर हो जाएगा। –

+3

@Cresent: अच्छी तरह से बंद करने से पहले समारोह के संदर्भ में वर्तमान में निष्पादन संदर्भ के बाहर कहीं भी रखा जाना होगा। हालांकि फ़ंक्शन को एक गोलाकार संदर्भ के लिए तत्व युक्त वैरिएबल को संदर्भित करने की भी आवश्यकता नहीं होगी, यह तथ्य यह है कि वैरिएबल और फ़ंक्शन दोनों निष्पादन संदर्भ में मौजूद हैं, ऐसा करने के लिए पर्याप्त है। – AnthonyWJones

+0

यदि कोई करता है: फ़ंक्शन मेडेडमेंट() { var DOMifier = document.createElement ('div'); DOMifier.innerHTML = "

"; } श्रोता संलग्न होगा और इसे स्मृति में रखेगा। मेरे पास एक विधि है जो किसी भी स्ट्रिंग (जिसमें एचटीएमएल हो सकती है) लेती है और केवल टेक्स्ट नोड्स की पहचान करने के लिए निर्मित डोम पार्सर का उपयोग करती है। हालांकि, मुझे पार्स किए गए डॉम ऑब्जेक्ट्स रखने की आवश्यकता नहीं है। मुझे डर है कि अगर कोई स्ट्रिंग स्वयं को डोम पर वापस जोड़ सकती है तो मुझे रिसाव होगा। –

11

फ़ंक्शन समाप्त होने के बाद, ऑब्जेक्ट का कोई संदर्भ नहीं है, यानी यदि कचरा कलेक्टर ठीक से काम करता है, तो इसे एकत्र किया जाना चाहिए (एक आईई बग है जो गोम नोड्स शामिल होने पर परिपत्र संदर्भों के साथ ऑब्जेक्ट्स को रोकता है) ।

इसके अलावा, आपका कोड टूटा हुआ है क्योंकि स्थानीय चर हटा दिए जा सकते हैं: ऐसा करने का प्रयास करने से सख्त मोड ES5 में सिंटैक्स त्रुटि भी फेंक जाएगी।

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