प्रश्न: क्लोजर के लिए कई फायदे हैं, लेकिन नकारात्मक क्या हैं (मेमोरी रिसाव? Obfuscation समस्याएं? बैंडविड्थ increasage?)? इसके अतिरिक्त, क्लोजर्स की मेरी समझ सही है? आखिरकार, एक बार बंद होने के बाद, क्या वे नष्ट हो सकते हैं?जावास्क्रिप्ट क्लोजर - नकारात्मक क्या हैं?
मैं जावास्क्रिप्ट क्लोजर के बारे में थोड़ा पढ़ रहा है। मुझे उम्मीद है कि कोई और अधिक जानकार मेरे दावे को मार्गदर्शन करेगा, मुझे गलत कहां सुधार देगा।
क्लोजर के लाभ:
- , एक स्थानीय गुंजाइश के लिए चर समाहित एक आंतरिक कार्यप्रणाली का उपयोग कर। फ़ंक्शन की गुमनाम महत्वहीन है।
<script type="text/javascript"> var global_text = ""; var global_count = 0; var global_num1 = 10; var global_num2 = 20; var global_num3 = 30; function outerFunc() { var local_count = local_count || 0; alert("global_num1: " + global_num1); // global_num1: undefined var global_num1 = global_num1 || 0; alert("global_num1: " + global_num1); // global_num1: 0 alert("global_num2: " + global_num2); // global_num2: 20 global_num2 = global_num2 || 0; // (notice) no definition with 'var' alert("global_num2: " + global_num2); // global_num2: 20 global_num2 = 0; alert("local_count: " + local_count); // local_count: 0 function output() { global_num3++; alert("local_count: " + local_count + "\n" + "global_count: " + global_count + "\n" + "global_text: " + global_text ); local_count++; } local_count++; global_count++; return output; } var myFunc = outerFunc(); myFunc(); /* Outputs: ********************** * local_count: 1 * global_count: 1 * global_text: **********************/ global_text = "global"; myFunc(); /* Outputs: ********************** * local_count: 2 * global_count: 1 * global_text: global **********************/ var local_count = 100; myFunc(); /* Outputs: ********************** * local_count: 3 * global_count: 1 * global_text: global **********************/ alert("global_num1: " + global_num1); // global_num1: 10 alert("global_num2: " + global_num2); // global_num2: 0 alert("global_num3: " + global_num3); // global_num3: 33 </script>
दिलचस्प बातें मैं इसके बारे में बाहर ले:
क्या मैं उपयोगी पाया है स्थानीय/वैश्विक विस्तार के बारे में कुछ बुनियादी परीक्षण करना है
outerFunc में अलर्ट केवल एक बार बुलाए जाते हैं, जो तब होता है जब बाहरी फ़नक कॉल myFunc (myFunc = outerFunc()) को असाइन किया जाता है। यह असाइनमेंट बाहरी फनक को खोलने लगता है, जिसमें मैं एक सतत स्थिति को कॉल करना चाहता हूं।
हर myFunc, कहा जाता है वापसी निष्पादित किया जाता है। इस मामले में, वापसी आंतरिक कार्य है।
वास्तव में कुछ दिलचस्प स्थानीयकरण जब स्थानीय चर को परिभाषित होता है। सूचना global_num1 और global_num2 के बीच पहली चेतावनी में अंतर, पहले भी चर बनाया जा करने की कोशिश कर रहा है, global_num1 अपरिभाषित माना जाता है क्योंकि 'var' कि कार्य करने के लिए एक स्थानीय चर सूचित करने के लिए इस्तेमाल किया गया था। - जावास्क्रिप्ट इंजन के संचालन के क्रम में यह पहले से बात की गई है, यह काम करने के लिए यह देखना अच्छा लगता है।
वैश्विक अभी भी इस्तेमाल किया जा सकता है, लेकिन स्थानीय चर उन्हें पार कर जाएगी। तीसरे myFunc कॉल से पहले नोटिस, स्थानीय_count नामक एक वैश्विक चर बनाया गया है, लेकिन यह आंतरिक फ़ंक्शन पर कोई प्रभाव नहीं है, जिसमें एक वैरिएबल है जो एक ही नाम से जाता है। इसके विपरीत, प्रत्येक फ़ंक्शन कॉल में वैश्विक चर को संशोधित करने की क्षमता होती है, जैसा वैश्विक_var3 द्वारा देखा गया है।
पोस्ट विचार: हालांकि कोड सीधा है, यह तुम लोगों के लिए अलर्ट से भरा हुआ है, ताकि आप प्लग और खेल सकते हैं।
मुझे पता है कि बंद होने के अन्य उदाहरण हैं, जिनमें से कई लूपिंग संरचनाओं के साथ संयोजन में अज्ञात कार्यों का उपयोग करते हैं, लेकिन मुझे लगता है कि यह प्रभाव देखने के लिए 101-स्टार्टर कोर्स के लिए अच्छा है।
एक बात मैं के साथ चिंतित हूँ नकारात्मक प्रभाव बंद स्मृति पर होगा। चूंकि यह फ़ंक्शन वातावरण को खुला रखता है, यह स्मृति में संग्रहीत उन चर को भी रखता है, जो विशेष रूप से डोम ट्रैवर्सल और कचरा संग्रह के संबंध में प्रदर्शन प्रभाव नहीं हो सकता है। मुझे यह भी यकीन नहीं है कि स्मृति रिसाव के मामले में यह किस तरह की भूमिका निभाएगा और मुझे यकीन नहीं है कि अगर बंद को स्मृति से हटाया जा सकता है तो "मेरे myfunc को हटाएं;"
आशा इस मदद करता है किसी को,
vol7ron
मैं इस के लिए कुछ पॉपकॉर्न पॉपिंग कर रहा हूं। – Pointy