2015-03-30 11 views
9

केक ... ehm, कोड के इस टुकड़े पर विचार करें:क्या यह कार्य कचरा-एकत्रित हो सकता है?

'use strict' 

function doWork() { 
    return new Promise(function (resolve, reject) { 
    // work work work... 
    // Done! But... where's the resolve() ??? 
    }) 
} 

doWork().then(function doMoreWork() { 
    // Some more work to do... 
}) 

एक बार वादा के निर्माता में समारोह खत्म ...

  1. Promise वस्तु कचरा-संग्रहणीय है?
  2. doMoreWork() कचरा-संग्रहणीय है?

मेरा अनुमान है कि doMoreWork() नहीं किया जा सकता जीसी एड सीधे क्योंकि वादा इसे करने के लिए एक संदर्भ रहता है, लेकिन एक बार वादा के शरीर खत्म और ऊपरी (?) गुंजाइश के लिए निष्पादन संदर्भ देता है, ढेर unwinds (क्योंकि निष्पादित करने के लिए यहां कोई और वक्तव्य नहीं है) और वादा पहुंचने योग्य नहीं है, इस प्रकार कचरा-संग्रहणीय है।

क्या आप इस बात की पुष्टि कर सकते हैं कि इस विषय की मेरी समझ सही है?

मैं इस व्यवहार का अनुभव कैसे कर सकता हूं? दूसरे शब्दों में, मैं कैसे निगरानी कर सकता हूं कि कौन सी ऑब्जेक्ट्स जीसी-एड हैं और कब? मैं पूरी तरह से Node.js में विकसित होता हूं, अगर इससे कोई फर्क पड़ता है।

+0

क्या आपका मतलब है कि आपका काम कभी भी 'हल() 'नहीं कहता है? हां, उस स्थिति में आपकी सभी वस्तुओं को तुरंत जीसी पर संदेह होगा। – Bergi

उत्तर

1

वादे के संदर्भ में कुछ भी नहीं है, इसलिए यह कचरा इकट्ठा होगा। वचन doMoreWork फ़ंक्शन के संदर्भ में एकमात्र चीज है, इसलिए यह कचरा भी एकत्रित किया जाएगा।

मैं इस व्यवहार का अनुभव कैसे कर सकता हूं? दूसरे शब्दों में, मैं कैसे निगरानी कर सकता हूं कि जीसी-एड क्या वस्तुएं हैं और कब? मैं पूरी तरह से Node.js में विकसित होता हूं, अगर इससे कोई फर्क पड़ता है।

वी 8 में जीसी कभी भी एक वस्तु एकत्र नहीं करता है। उदाहरण के लिए यदि यह आपका पूरा कार्यक्रम है, तो यह पहली जगह में किसी भी जीसी को चलाने के लिए समय बर्बाद होगा।

0
  1. Promise ऑब्जेक्ट एकत्रित करने योग्य है यदि इसका कोई संदर्भ नहीं है। यदि इसका उपयोग doWork().then(...) किया जाता है तो एक अस्थायी संदर्भ बनाया जाता है। तो .then जब तक ब्लॉक नहीं करता अब और वहाँ ऑब्जेक्ट के संदर्भ आप कर रहे हैं ठीक है, doMoreWork भी नहीं संग्रहणीय क्योंकि Promise वस्तु यह

बयान के लिए एक संदर्भ है तो यह एकत्र नहीं किया जा सकता

  • है doWork().then(...) द्वारा

    new Promise(function (resolve, reject) { 
        // work work work... 
    }).then(function doMoreWork() { 
          // Some more work to do... 
         }) 
    

    बदला जा सकता है तो क्या आप कल्पना कर सकते हैं कि आप Promise वस्तु सीधे उपयोग कर रहे हैं, तो "ऊपरी" -Scope जहां किसी चीज़ का इस्तेमाल किया जाता है।

    ऑब्जेक्ट्स आमतौर पर एकत्र किए जाते हैं जब इसके कोई और संदर्भ नहीं होते हैं। भले ही कोड वादा में है, यह केवल एक ऑब्जेक्ट है और then पर कॉल जंजीर है, इसलिए ऑब्जेक्ट का उपयोग किया जा रहा है

  • +0

    मुझे लगता है कि Esailija का जवाब सही होना चाहिए, लेकिन यह वादा कार्यान्वयन को जानने के बिना साबित नहीं किया जा सकता है। वादा बनाया गया है, एक एकल .थ() कॉल उस पर किया जाता है, फिर, कोड के अनुसार, यह अप्रयुक्त है इसलिए वादा और उसके बाद तर्क() दोनों को पुनर्नवीनीकरण किया जा सकता है। लेकिन, अगर आपका वादा कार्यान्वयन किसी प्रकार की आंतरिक सूची या बनाए गए वचनों की तालिका रखता है तो क्या होगा? शायद यह हल होने पर उन्हें मुक्त करता है; शायद कभी नहीं। मेरा अनुमान है कि वे इस तरह वादा कार्यान्वयन नहीं लिखते हैं; लेकिन कोई सबूत नहीं है। किसी भी तरह से, आपका जेएस प्रोग्राम अंतर नहीं बता सकता है। – OsamaBinLogin

    0

    यह देखने के लिए कि कोई ऑब्जेक्ट कचरा-संग्रहणीय है या नहीं, आप एक परीक्षण बना सकते हैं और मेमोरी लीक (टास्क मैनेजर के माध्यम से) देख सकते हैं। यदि आपका कोड ठीक से लिखा गया है, तो सब कुछ एकत्र हो जाता है।

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