2011-07-25 10 views
18

तो मैं कोड के इस टुकड़े मिल गया है और यह स्पष्ट रूप से काम करता है (के रूप में यह साल के लिए उत्पादन में किया गया है):स्वयं जावास्क्रिप्ट फ़ंक्शन को नष्ट करना - यह कैसे काम करता है?

window[someMethod] = function (tmp) { 
    callback({prop:"val"}, tmp); 

    // Garbage collect 
    window[someMethod] = undefined; 
    try { 
     delete window[someMethod]; 
    } 
    catch (e) { } 
    if (head) { 
     head.removeChild(script); 
    } 
    // head refers to DOM head elem and script refers to some script file elem 
}; 

पता करने के लिए उत्सुक है, यह कैसे काम करता है?

  1. यह कैसे delete ही undefined अपने शरीर के भीतर और try को ही सेट कर सकते हैं?
  2. क्या ब्राउज़र को कॉल समाप्त होने तक undefined और delete निष्पादित नहीं करना है? और कैसे?
  3. यदि ब्राउज़र तुरंत इसे हटा देता है, तो उसके बाद क्या होता है? क्या आखिरी पंक्ति चलती है?
  4. अंत में, क्या आप लोग इस लीकिंग मेमोरी को देखते हैं? यदि हां, तो कैसे?

उत्तर

21
  1. यह अपरिभाषित को ही की स्थापना नहीं कर रहा है, यह अनिर्धारित करने के लिए खुद के लिए एक संदर्भ सेट करते हैं। यदि आप स्मृति में कोड के ब्लॉक के रूप में फ़ंक्शन के बारे में सोचते हैं, तो इस मामले में कोड का ब्लॉक हटाया नहीं गया है, केवल इसका संदर्भ। आपने कभी भी जावास्क्रिप्ट में कुछ भी स्पष्ट रूप से हटाया नहीं है, आप बस इसके संदर्भों को हटा दें और इसे साफ़ करने के लिए कचरा कलेक्टर को छोड़ दें। नोट, यह वास्तविक कोड के लिए मामला नहीं हो सकता है, केवल इंजन को ढेर करें, क्योंकि इंजन के ऊपर इसका इलाज कैसे करें (इसे समझें, इसे संकलित करें, इसे एबैकस पर निष्पादित करें, जो भी हो)
  2. उस तर्क के आधार पर, एक बार फ़ंक्शन निष्पादित हो रहा है, इसके मूल संदर्भ की आवश्यकता नहीं है क्योंकि इसे प्रारंभ में केवल निष्पादन को स्थानांतरित करने की आवश्यकता थी।
  3. आप जेएस मूल्यांकन को गलत समझ रहे हैं क्योंकि प्रत्येक कथन के लिए इसका संदर्भ आवश्यक है। सभी संभावनाओं में, यह विधि जस्ट-इन-टाइम संकलित की गई है और अब किसी भी अन्य गैर-जेएस फ़ंक्शन की तरह निष्पादित हो रही है।
  4. उपरोक्त कोड में कोई स्पष्ट स्मृति रिसाव नहीं है।

उम्मीद है कि यह समझ में आता है।

+1

भले ही कॉलबैक फ़ंक्शन कहीं भी 'tmp' के संदर्भ को बरकरार रखे, मुझे नहीं लगता कि स्मृति मेमोरी क्यों होगी ... –

+1

आप शायद सही, अद्यतन उत्तर हैं। – yan

+0

यह बहुत उपयोगी है। मुझे लगता है कि इसे पोस्ट करने से पहले आज एक मस्तिष्क था! – Mrchief

2

विंडो [someMethod] बस एक संदर्भ है। केवल संदर्भ हटा दिया गया है, फ़ंक्शन स्वयं ही नहीं। एक बार कार्य पूरा हो जाने के बाद, और इसके सभी संदर्भ हटा दिए जाते हैं, कचरा संग्रह को इसकी देखभाल करनी चाहिए, स्मृति रिसाव से परहेज करना चाहिए।

3

याद रखें कि आप स्पष्ट रूप से जावास्क्रिप्ट में कुछ हटा नहीं सकते हैं। आप जो कुछ भी कर सकते हैं वह सभी संदर्भों को हटा देता है और इसलिए कचरा कलेक्टर इसे अगले चक्र पर हटा दें। इस फ़ंक्शन के अंत तक, फ़ंक्शन स्वयं स्मृति में है, लेकिन इसमें कोई बाहरी संदर्भ नहीं है। अगली बार जब जीसी चलता है, तो यह इसे स्पॉट करेगा और इसकी याददाश्त को हटा देगा।

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