क्या कोई मेमोरी लीक को रोकने के लिए उपयोग किए जाने वाले असाइनमेंट-टू-नल फिक्स की प्रकृति के संबंध में मेरे लिए खुजली खरोंच कर सकता है?जावास्क्रिप्ट मेमोरी लीक: ऑब्जेक्ट को शून्य काम क्यों सौंपेगा?
हम सब निम्नलिखित तकनीक, डोम वस्तु और जे एस वस्तु के बीच वृत्तीय संदर्भ को रोकने के लिए आदेश में मेमोरी लीक को रोकने के लिए के साथ परिचित हैं:
function foo() {
var ele = document.getElementById("someParagraphId");
ele.onclick = function() {
//some action here
};
ele = null;
}
सवाल क्यों करेंगे ऊपर काम है? "Ele" को शून्य पर सेट करना निश्चित रूप से परिपत्र संदर्भों को रोक देगा, लेकिन क्या यह "ele" के भविष्य के संदर्भों को भी रोक नहीं पाएगा?
function foo() {
var ele = document.getElementById("someParagraphId");
ele.onclick = function() {
console.log("accessing ele ... after set to null " + ele.onclick);
};
ele = null;
}
और फिर भी ईवेंट श्रोता आग लगती है। यह शिकायत करेगा कि "ele" ऑब्जेक्ट शून्य है (जो हम उम्मीद करेंगे)।
उपरोक्त व्यवहार को देखते हुए, क्या हम यह समझने का अधिकार रखते हैं कि जावास्क्रिप्ट इंजन कार्यान्वयन घटना श्रोता के लिए किसी प्रकार का आंतरिक संदर्भ रखेगा, और यह संदर्भ है जिसे ईवेंट ट्रिगर किया जाता है?
eventHandlerRef = //assignment to "ele.onclick" handler/listener;
यदि उपरोक्त जैसा कोई संदर्भ होना था, तो असाइनमेंट-टू-नल फिक्स कार्यान्वयन पर निर्भर नहीं होगा? या, यह ईसीएमएस्क्रिप्ट विनिर्देश का हिस्सा है।
मेरी समझ से, यह तय हमेशा ब्राउज़र ब्राउज़र सुरक्षित रहा है। मैं कई उदाहरणों में नहीं आया हूं जो शून्य असाइनमेंट लागू करने से पहले ब्राउज़र प्रकार का पता लगाने/स्नीफ करने पर विशिष्ट उल्लेख करता है।
=============== संपादित ==================
मैं की वजह से लगता है जिस तरह से मैंने सवाल उठाया है, वह अनजाने में सीधे चर्चा कर सकता है जो मैं व्यक्त करने की कोशिश कर रहा था। अवधारणाओं के एक जोड़े कि उनका संदर्भ दिया जा:
वस्तु आला/वस्तु संदर्भ संभालता है:
var obj1, obj2;
obj1 = {foo: "bar"}; //obj1 points to the an area of the heap allocated
//for the object literal.
obj2 = obj1; //obj2 points to the same position in the heap
//as obj1.
//obj1 = null or
obj1 = {/*another obj literal*/} //the new object literal is created
//and allocated in some other part
//in the heap, and obj1 now points
//to the new location.
//obj2 is unaffected by obj1's re-assignment.
ऊपर
जहाँ मेरे खुजली झूठ नहीं है, और मैं पंक्ति जोड़कर अफसोस:
console.log("accessing ele ... after set to null " + ele.onclick);
उपर्युक्त यह एक बंद प्रश्न बनाता है। मुझे उम्मीद है कि मूल पोस्ट में संकेत के रूप में त्रुटि को फेंक दिया जाएगा।
मेरा खुजली संदर्भ के साथ अधिक है ... किसी कारण से, मेरे दिमाग में, मैं सोचता रहता हूं कि जावास्क्रिप्ट इंजन सीधे ele.onlick()
को कॉल करेगा जब ईवेंट आग को शून्य पर रखता है और सेट करता है, निम्न प्रवाह के समान है :
var obj = {};
obj.method = function() {};
var objRef = obj;
obj = null;
//The Javascript Engine calling objRef.method when event triggered.
मेरे खुजली आता है:
var obj = {};
obj.method = function() {};
obj = null;
//error calling obj.method(), i.e., obj is null
यह देखते हुए कि हम मूल पोस्ट कि ईवेंट हैंडलर अभी भी हाथी अशक्त करने के लिए स्थापित किया गया है के बाद आग में पता है, मेरे मन में प्रवाह के अधिक समान है सवाल के नीचे, ऊपर है कि कैसे अधिकांश जा vascript कार्यान्वयन कार्य, जहां कुछ आंतरिक संदर्भ इवेंट हैंडलर को इंगित कर रहा है, और यह आंतरिक संदर्भ कहा जाता है जब ईवेंट ट्रिगर होता है?
या, अलग ढंग से phrased क्या बुला एकele.onclick()
सीधे (पल डिजाइन और वास्तुकला के मुद्दों के लिए दरकिनार) से एक जावास्क्रिप्ट इंजन कार्यान्वयन रोक रहा है?
शायद मेरी विचार प्रक्रियाएं अलग-अलग काम करती हैं, लेकिन किसी और ने दूसरी बार ऐसा नहीं देखा जब उन्हें पहली बार असाइनमेंट-टू-नल फिक्स का सामना करना पड़ा, जहां तत्व संदर्भ शून्य-एड था और फिर भी कोड हैंडलर अभी भी निष्पादित किया गया था?
मैंने आपके संपादन को संबोधित करने के लिए अपना उत्तर संपादित कर दिया है। – zneak