2008-11-05 7 views
76

क्या किसी अन्य ऑब्जेक्ट को "कमजोर संदर्भ" बनाने के लिए जावास्क्रिप्ट में कोई तरीका है? Here is the wiki page describing what a weak reference is.Here is another article that describes them in Java. क्या कोई जावास्क्रिप्ट में इस व्यवहार को लागू करने का तरीका सोच सकता है?क्या जावास्क्रिप्ट में "कमजोर संदर्भ" बनाना संभव है?

+3

का उपयोग करके कोई अलग नहीं है ES6 के लिए कमजोर संदर्भों पर चर्चा की जा रही है। अपनी आँखें खुली रखें। –

+6

@RyanSmith: मेरी आंखों को छीलने में मदद करें और अब मैं उन्हें – Claudiu

+0

बंद नहीं कर सकता * आधिकारिक विशिष्ट विकी/चर्चा http://wiki.ecmascript.org/doku.php?id=strawman:weak_refs पर, वर्तमान में "अंतिम संशोधित: 2013/02/02 22:25 " * https://esdiscuss.org/topic/what-is-the-status-of-weak-references पर कुछ अन्य विशिष्ट चर्चा, वर्तमान में अंतिम पोस्ट" सूर्य मार्च 3 11:56:05 पीएसटी 2013 " –

उत्तर

32

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

तो आपका 'कमजोर संदर्भ' एक सरल लुकअप में एक कुंजी (उदाहरण के लिए पूर्णांक) बन जाता है, एक ऐड-रेफरेंस और हटाने-संदर्भ विधि के साथ, और जब मैन्युअल रूप से ट्रैक किए गए संदर्भ नहीं होते हैं तो प्रविष्टि को हटाया जा सकता है, शून्य को वापस करने के लिए उस कुंजी पर भावी लुकअप छोड़ना।

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

+2

मैंने कोड की सावधानी से जांच नहीं की है (या उपयोग किया गया है), लेकिन ईएस-लैब में एक स्क्रिप्ट है जो मूल [वीकैप इम्यूलेशन] प्रदान करती है (http://code.google.com/p/es-lab/source/browse/trunk/ src/सत्र/WeakMap.js)। [अरोड़ा 6] (http://hacks.mozilla.org/2011/05/aurora-6-is-here/) (मोज़िला) में एक गैर मानक [WeakMap कार्यान्वयन] है (https://developer.mozilla.org/en/जावास्क्रिप्ट/संदर्भ/Global_Objects/WeakMap)। – theazureshadow

+1

क्या आप इसके लिए कुछ कोड दिखा सकते हैं, या कुछ से लिंक कर सकते हैं? –

+2

ES6 के साथ यह उत्तर अब सही नहीं है। नीचे मेरा जवाब देखें http://stackoverflow.com/a/28567560/745190 – thelastshadow

-3

http://www.jibbering.com/faq/faq_notes/closures.html

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

यह आमतौर पर निष्पादन संदर्भ से बाहर निकलने का मामला होगा। स्कोप चेन स्ट्रक्चर, एक्टिवेशन/वैरिएबल ऑब्जेक्ट और फंक्शन ऑब्जेक्ट्स सहित निष्पादन संदर्भ में बनाए गए किसी ऑब्जेक्ट्स अब उपलब्ध नहीं होंगे और इसलिए कचरा संग्रह के लिए उपलब्ध हो जाएंगे।

मतलब कोई कमजोर नहीं है जो अब उपलब्ध नहीं हो पाएंगे।

+9

संदर्भ चक्र से बचने के लिए कमजोर संदर्भों का उपयोग करने का एकमात्र कारण नहीं है। वे ऑब्जेक्ट इंस्टेंस पूलिंग/कैशिंग आदि के लिए बहुत आसान हैं। – fluffy

2

बस संदर्भ के लिए; जावास्क्रिप्ट में यह नहीं है, लेकिन एक्शनस्क्रिप्ट 3 (जो ईसीएमएस्क्रिप्ट भी है) करता है। constructor parameter for Dictionary देखें।

+0

लिंक पुराना है। –

2

सच कमजोर संदर्भ, नहीं, अभी तक नहीं (लेकिन ब्राउज़र निर्माता इस विषय को देख रहे हैं)। लेकिन यहां कमजोर संदर्भों को अनुकरण करने के बारे में एक विचार है।

आप एक कैश बना सकते हैं जिसे आप अपनी ऑब्जेक्ट्स चलाते हैं। जब कोई ऑब्जेक्ट संग्रहीत होता है, तो कैश इस बात की भविष्यवाणी करता है कि ऑब्जेक्ट कितनी मेमोरी लेगा। कुछ वस्तुओं के लिए, छवियों को संग्रहीत करने की तरह, यह काम करने के लिए सीधे आगे है। दूसरों के लिए यह और अधिक कठिन होगा।

जब आपको ऑब्जेक्ट की आवश्यकता होती है, तो आप इसके लिए कैश पूछते हैं। यदि कैश में ऑब्जेक्ट है, तो यह वापस कर दिया जाता है। यदि यह वहां नहीं है, तो आइटम जेनरेट, संग्रहीत, और फिर लौटाया जाता है।

कमजोर संदर्भ कैश द्वारा आइटम को हटाने के द्वारा अनुरूपित किए जाते हैं, जब अनुमानित स्मृति की कुल राशि एक निश्चित स्तर तक पहुंच जाती है। यह भविष्यवाणी करेगा कि किस वस्तु को कम से कम उपयोग किया जाता है, इस आधार पर कि उन्हें कितनी बार पुनर्प्राप्त किया जाता है, कितनी देर पहले उन्हें बाहर निकाला जाता था। एक 'गणना' लागत भी जोड़ा जा सकता है, यदि आइटम बनाता है जो कोड को बंद करने के रूप में कैश में पास किया जाता है। यह कैश को ऐसी वस्तुओं को रखने की अनुमति देगा जो निर्माण या उत्पन्न करने के लिए बहुत महंगा हैं।

हटाना एल्गोरिदम कुंजी है, क्योंकि यदि आपको यह गलत लगता है तो आप सबसे लोकप्रिय वस्तुओं को हटा सकते हैं। इससे भयानक प्रदर्शन होगा।

जब तक कैश एकमात्र ऑब्जेक्ट स्थायी संग्रहीत वस्तुओं के संदर्भ के साथ एकमात्र ऑब्जेक्ट है, तो उपरोक्त सिस्टम को वास्तविक कमजोर संदर्भों के विकल्प के रूप में बहुत अच्छी तरह से काम करना चाहिए।

+22

क्या आपने कमजोरियों के लिए अप्रासंगिक कहा है? –

+2

@ErikAllik कमजोर संदर्भों के लिए अधिकांश उपयोग डेटा की बड़ी मात्रा को स्टोर करना है, और यदि आप स्थान से बाहर निकलते हैं तो इसे हटा दें। मैंने नकली तरीके से वर्णन किया कि, स्वचालित रूप से स्मृति को ट्रैक करके, और जब आइटम की आवश्यकता नहीं होती है तो आइटम को हटाकर। – JL235

+19

@ जेएल 235 - कमजोर संदर्भों के लिए महत्वपूर्ण उपयोग कैश के लिए नहीं बल्कि घटना-हैंडलर के लिए है। मेरे पास कुछ वस्तु है कि, जबकि यह अस्तित्व में है, कुछ अन्य घटनाओं का पालन करना चाहिए - लेकिन मैं यह नहीं चाहता कि यह जीसी के प्रयोजनों के लिए एक संदर्भ बनाने के लिए अधिसूचना सूची में है। – Malvolio

-1

एक्मास्क्रिप्ट 6 (ईएस हार्मनी) में WeakMap ऑब्जेक्ट है। आधुनिक ब्राउज़रों के बीच ब्राउज़र समर्थन pretty good (फ़ायरफ़ॉक्स, क्रोम के अंतिम 3 संस्करण और यहां तक ​​कि आने वाले आईई संस्करण का भी समर्थन है)।

+18

यह बिल्कुल वही नहीं है। एक 'वीकमैप' ऑब्जेक्ट्स को कमजोर संदर्भ नहीं देता है - यह * मान * नहीं है जो कमजोर में कमजोर संदर्भ हैं, लेकिन ** कुंजी **। तथ्य यह है कि मानचित्र में कमजोर संदर्भ मौजूद हैं केवल स्मृति स्मृति रिसाव रोकथाम तंत्र है, और अन्यथा उपयोगकर्ता को देखने योग्य नहीं है। – EyasSH

+1

आप सही हैं कि यह चाबियाँ कमजोर हैं, मान नहीं। लेकिन कमजोर संदर्भों का उपयोग करने का पूरा उद्देश्य संदर्भित वस्तु के कचरे के संग्रह की अनुमति देना है। ओपी ने दो लिंक पोस्ट किए हैं, जिनमें से दूसरा एक ऑब्जेक्ट में एक आईडी जोड़ने के बारे में है जिसे आप विस्तारित नहीं कर सकते हैं, और वास्तव में यह जावास्क्रिप्ट के वीकैप के जावा समकक्ष वीकहाश मैप का उपयोग करने की सिफारिश करता है। – thelastshadow

+10

कमजोर संदर्भ को लागू करने के लिए वीकैप का उपयोग करके शुभकामनाएं 'weakmap.get (नई स्ट्रिंग (' कोई भी संभावित कुंजी जो कभी अस्तित्व में है या कभी अस्तित्व में है '))' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ *उपयोगी नहीं। नीचे मतदान! – user3338098

0

एक कमजोर संदर्भ अनुकरण करने के लिए कैशिंग तंत्र का उपयोग करना, JL235above का सुझाव दिया गया है, उचित है।

this.val = {}; 
this.ref = new WeakReference(this.val); 
... 
this.ref.get(); // always returns val 
... 
this.val = null; // no more references 
... 
this.ref.get(); // may still return val, depending on already gc'd or not 

जबकि एक कैश के साथ आप का पालन होगा::

this.val = {}; 
this.key = cache.put(this.val); 
... 
cache.get(this.key); // returns val, until evicted by other cache puts 
... 
this.val = null; // no more references 
... 
cache.get(this.key); // returns val, until evicted by other cache puts 

एक संदर्भ के एक धारक के रूप में, आप किसी भी मान्यताओं नहीं करना चाहिए तो कमजोर संदर्भ मूल रूप मौजूद होगा, तो आप इस तरह एक व्यवहार का निरीक्षण करेंगे जब यह किसी मान को संदर्भित करता है, तो यह कैश