बनाम कच्चे expando गुण (मनमाने ढंग से गुण आप डोम नोड्स को असाइन कर सकते) jQuery.data का माना लाभों में से एक की सटीक व्याख्या यह है कि jQuery.data "मेमोरी लीक से वृत्तीय संदर्भ से सुरक्षित है और इसलिए मुक्त" है।जावास्क्रिप्ट <-> डोम वृत्तीय संदर्भ मुद्दा
वेब अनुप्रयोगों के लिए सबसे आम मेमोरी लीक जावास्क्रिप्ट स्क्रिप्ट इंजन और ब्राउज़रों 'सी ++ वस्तुओं' जावास्क्रिप्ट के बीच लागू करने डोम (जैसे के बीच परिपत्र संदर्भ शामिल: गूगल से एक लेख "Optimizing JavaScript code" शीर्षक से अधिक विस्तार में चला जाता है स्क्रिप्ट इंजन और इंटरनेट एक्सप्लोरर के COM बुनियादी ढांचे, या जावास्क्रिप्ट इंजन और फ़ायरफ़ॉक्स XPCOM आधारभूत संरचना के बीच)। के माध्यम से expando → मध्यस्थ वस्तु → DOM एलीमेंट
DOM एलीमेंट → ईवेंट हैंडलर → बंद गुंजाइश → डोम
DOM एलीमेंट →:
यह वृत्तीय संदर्भ पैटर्न के दो उदाहरणों को सूचीबद्ध
हालांकि, यदि एक डोम नोड और जावास्क्रिप्ट ऑब्जेक्ट के बीच एक संदर्भ चक्र स्मृति रिसाव उत्पन्न करता है, तो इसका मतलब यह नहीं है कि कोई भी गैर-मामूली घटना हैंडलर (उदा। onclick
) ऐसे रिसाव का उत्पादन करेगा? मुझे नहीं कि यह कैसे भी संभव है एक ईवेंट हैंडलर एक संदर्भ चक्र से बचने के लिए के लिए है, क्योंकि जिस तरह से मैं इसे देख:
डोम तत्व का संदर्भ ईवेंट हैंडलर।
ईवेंट हैंडलर डीओएम (या तो प्रत्यक्ष या परोक्ष रूप से) का संदर्भ देता है। किसी भी मामले में,
window
किसी भी रोचक घटना हैंडलर मेंsetInterval
लूप लिखने से कम, जो वैश्विक कतार से क्रियाओं को पढ़ता है, को संदर्भित करना लगभग असंभव है।
किसी जावास्क्रिप्ट ↔ डोम वृत्तीय संदर्भ समस्या का एक सटीक विवरण प्रदान कर सकते हैं? चीजें जिन्हें मैं स्पष्ट करना चाहता हूं:
कौन से ब्राउज़र प्रभावित होते हैं? JQuery स्रोत में एक टिप्पणी विशेष रूप से आईई 6-7 का उल्लेख करती है, लेकिन Google लेख से पता चलता है कि फ़ायरफ़ॉक्स भी प्रभावित है।
विस्तारित गुण और ईवेंट हैंडलर मेमोरी लीक से संबंधित किसी भी तरह से अलग हैं? या ये दोनों कोड स्निपेट एक ही तरह की मेमोरी रिसाव के लिए अतिसंवेदनशील हैं?
// Create an expando that references to its own element. var elem = document.getElementById('foo'); elem.myself = elem; // Create an event handler that references its own element. var elem = document.getElementById('foo'); elem.onclick = function() { elem.style.display = 'none'; };
तो एक पेज लीक स्मृति वजह से एक परिपत्र संदर्भ के लिए, करता रिसाव जारी रहती है जब तक पूरे ब्राउज़र आवेदन बंद कर दिया है, या स्मृति मुक्त हो जाता है जब विंडो/टैब बंद कर दिया है?
क्या यह कोड वास्तव में मेमोरी लीक का कारण बनता है? मुझे समझ नहीं आता क्यों। var elem = document.getElementById ('foo'); elem.myself = elem; – CEGRD