2011-07-14 15 views
30

पूर्व में किसी समय में, मैं जबकि नामित (स्थिर, कुछ है कि मुझे यह विचार है कि जावास्क्रिप्ट में अनाम प्रक्रियाएं स्मृति का एक आश्चर्यजनक राशि का उपयोग कर सकते (क्योंकि वे उन लोगों के साथ चारों ओर पूरे वर्तमान क्षेत्र पाया जाता है) दे दी है पढ़ा है?) कार्यों में यह समस्या नहीं है।जावास्क्रिप्ट में अज्ञात कार्यों का उपयोग करने के लिए कोई कमी है? जैसे स्मृति उपयोग?

मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है, इसलिए मैं वापस नहीं जा सकता और इसे फिर से पढ़ सकता हूं और इसे अपने लिए समझ सकता हूं।

  1. स्थितियों में, जहां अनाम प्रक्रियाएं इसके लिए पर्याप्त स्मृति का उपयोग कर सकते हैं के बारे में ध्यान रखने लायक हो वहाँ कर रहे हैं:

    मैं दो प्रश्न हैं? (यदि हां, तो क्या आपके पास कोई उदाहरण है?)

  2. क्या अज्ञात कार्यों (नामित/स्थैतिक कार्यों के विपरीत) में कोई अन्य कमी है?
+0

उत्कृष्ट प्रश्न। मैंने दिन के लिए अपने वोटों का उपयोग किया है - क्या कोई और मेरे लिए +1 कर सकता है? –

+0

@ माइकल पहले से ही किया है। महान सवाल –

+0

बंद करने के * कार्यान्वयन * के बारे में SO पर समान प्रश्न रहा है, लेकिन मुझे अभी तक एक संतोषजनक उत्तर के साथ एक देखना नहीं है। यही है, * आधुनिक * जावास्क्रिप्ट इंजन केवल [[स्कोप]] में ऑब्जेक्ट्स रखने के लिए पर्याप्त स्मार्ट हैं जिन्हें * एक्सेस किया जा सकता है? जाहिर है, यह अनुकूलन 'eval', आदि की उपस्थिति में लागू करने के लिए व्यावहारिक नहीं है ... –

उत्तर

7

सभी जावास्क्रिप्ट कार्यों कि में एक ही तरीके से व्यवहार करेंगे वे करने के लिए अग्रणी, और खुद को भी शामिल है, पूरे दायरे श्रृंखला में चर वातावरण प्राप्त करती हैं। यह अनाम और नामित दोनों कार्यों के लिए भी उतना ही सच है।

बाहरी वातावरण के लिए संदर्भ की यह श्रृंखला प्रत्येक कार्य के साथ रहता है, समारोह एक बिल्कुल अलग दायरे में पारित हो जाता है, भले ही।

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

हालांकि, ऐसी अन्य स्थितियां हैं जहां एक अनाम कार्य कचरा है।

यहाँ कोड का एक आम सा है:

for(var i = 0; i < 100; i++) { 
    (function(j) { 
     setTimeout(function() { console.log(j); }, 1000); 
    })(i); 
} 

यह एक स्थिति है जहाँ एक गुमनाम समारोह में थोड़ा और अधिक एक नामित समारोह से बेकार है, क्योंकि आप पाश के दौरान एक समान समारोह में 100 गुना कर रहे हों तब होता है जब आप सिर्फ नामित एक का पुन: उपयोग कर सकता है।

function setConsole(j) { 
    setTimeout(function() { console.log(j); }, 1000); 
} 

for(var i = 0; i < 100; i++) { 
    setConsole(i); 
} 

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

http://jsperf.com/immediate-vs-named(जेएसपीआरएफ के लिए @Felix Kling पर धन्यवाद।)

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


संपादित करें:Here's an article from Google। विशेष रूप से, देखें बंद होने के साथ नुकसान से बचें। स्कोप श्रृंखला को विस्तारित करने के प्रदर्शन प्रभाव के बारे में जानकारी के लिए, और दावा के लिए कि अनाम कार्य नामित कार्यों की तुलना में "धीमे" हैं।

+1

** मॉडरेटर नोट ** इस उत्तर के तहत _Comments हटा दिए गए थे क्योंकि वे संकेत से अधिक शोर में गिरावट आई थीं। कृपया टिप्पणियों को रचनात्मक, पेशेवर और सबसे अधिक विषय पर रखें ._ –

+1

हटाने के लिए @ टिम पोस्ट के लिए धन्यवाद। ओपी के साथ प्रासंगिक चर्चा का नतीजा, साथ ही @ फ़ेलिक्स क्लिंग द्वारा प्रदान किए गए प्रदर्शन परीक्षण को उत्तर में जोड़ा गया है। – user113716

3

मुझे लगता है कि आप शायद आईई क्लोजर मेमोरी लीक समस्या के बारे में क्या पढ़ते हैं।

इस मुद्दे पर this article पर देखें।

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

+0

हाँ, मुझे यकीन नहीं है कि यह था - मुझे आईई परिपत्र संदर्भ चीज याद है , और इसे बंद करने के साथ करना था (मुझे अपने सिर में चिपकने के लिए कभी भी पूरा विवरण नहीं मिल सका), लेकिन मुझे लगता है * जो चीज मैंने पढ़ी वह अज्ञात कार्यों के बारे में एक सामान्य बात थी। –

0

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

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

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