सभी जावास्क्रिप्ट कार्यों कि में एक ही तरीके से व्यवहार करेंगे वे करने के लिए अग्रणी, और खुद को भी शामिल है, पूरे दायरे श्रृंखला में चर वातावरण प्राप्त करती हैं। यह अनाम और नामित दोनों कार्यों के लिए भी उतना ही सच है।
बाहरी वातावरण के लिए संदर्भ की यह श्रृंखला प्रत्येक कार्य के साथ रहता है, समारोह एक बिल्कुल अलग दायरे में पारित हो जाता है, भले ही।
परंपरागत रूप से, इसका मतलब यह होगा कि किसी भी श्रृंखला में सभी चर एक संदर्भ के रूप में लंबे समय के रूप में आंतरिक बंद मौजूद करने के लिए जारी करने के लिए उन्हें अपने पास रखा है। यद्यपि कोड को संकलित करने वाले आधुनिक ब्राउज़रों में, यह संभावना है कि एक चर का विश्लेषण किया जाएगा कि वास्तव में किस चर का संदर्भ दिया जाता है, और केवल उन लोगों को बनाए रखा जाएगा, जिन्हें अब कचरा होने के संदर्भ में संदर्भित नहीं किया जाता है।
हालांकि, ऐसी अन्य स्थितियां हैं जहां एक अनाम कार्य कचरा है।
यहाँ कोड का एक आम सा है:
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 कर सकता है? –
@ माइकल पहले से ही किया है। महान सवाल –
बंद करने के * कार्यान्वयन * के बारे में SO पर समान प्रश्न रहा है, लेकिन मुझे अभी तक एक संतोषजनक उत्तर के साथ एक देखना नहीं है। यही है, * आधुनिक * जावास्क्रिप्ट इंजन केवल [[स्कोप]] में ऑब्जेक्ट्स रखने के लिए पर्याप्त स्मार्ट हैं जिन्हें * एक्सेस किया जा सकता है? जाहिर है, यह अनुकूलन 'eval', आदि की उपस्थिति में लागू करने के लिए व्यावहारिक नहीं है ... –