आपको यहां पहले सिद्धांतों का उपयोग करने की आवश्यकता है। जावास्क्रिप्ट लेक्सिकल स्कोपिंग का उपयोग करता है। इसका मतलब है कि निष्पादन संदर्भ का दायरा यह निर्धारित करता है कि कोड परिभाषित (शब्दावली) कैसे है।
मैं कहूंगा कि समारोह Bar
की परिभाषा क्या बंद बनाया जा करने का कारण बनता है, क्योंकि msg
समारोह में "बंद में" है।
बंद करने की वास्तविक निर्माण (है, जो एक अनुलापिक बयान के कुछ है एक कंप्यूटर प्रोग्राम में कुछ नहीं होता क्योंकि जब तक यह चलाया जाता है), क्योंकि आदेश msg
का मूल्य निर्धारित करने के लिए, क्रम में क्या होता है Bar
, जब Bar
में निष्पादित किया जाता है, दुभाषिया को चर के मान को जानने की आवश्यकता होती है जब Foo
निष्पादित किया जाता है, और इसलिए श्रृंखला पर।
मैं आपके प्रश्न के दो जवाब दूंगा। पैडेंटिक जवाब है: न तो स्वयं ही कार्य बंद है। यह परिभाषाओं के भीतर चर के परिभाषा है, जो चलने पर कार्यों के निष्पादन संदर्भ के साथ संयुक्त है, जो बंद होने को परिभाषित करता है। आम जवाब यह है: किसी भी फ़ंक्शन जो एक चर पर बंद हो जाता है वह बंद है (आपके मामले में बार)।
जावास्क्रिप्ट का उपयोग करते समय सभी को सामना करने वाली समस्या पर विचार करें।
function A(x) {
var y = x, fs = [];
for (var i = 0; i < 3; i++) {
fs.push(function(){
console.log (i + " " + x);
})
}
fs.forEach(function(g){g()})
}
A('hi')
ज्यादातर लोग कह सकते हैं कि इस 'हाय 1' 'हाय 2' के बाद 'हाय 3' के बाद उत्पादन का उत्पादन होगा। हालांकि, यह 'हाय 3' 3 बार पैदा करता है। यदि बाहरी फ़ंक्शन में परिभाषित चर का उपयोग करते समय, सरणी में फ़ंक्शन की परिभाषा को जोड़ा जा रहा है, तो बंद हो गया, यह कैसे हो सकता है?
ऐसा इसलिए है क्योंकि आपको बंद करने के लिए निष्पादन संदर्भ की आवश्यकता है, जो रनटाइम तक नहीं होता है। सरणी में कार्यों के निष्पादन पर, i
का मान है। forEach
कथन में, यह निष्पादन संदर्भ है, यही कारण है कि आउटपुट हमेशा 3 का उपयोग करता है।
आपको अपने प्रश्न में उन '
' टैग की आवश्यकता नहीं है। इसके अलावा, '()(); 'बिल्कुल अज्ञात फ़ंक्शन की परिभाषा नहीं है। – Pointy
@ प्वाइंट धन्यवाद, मुझे हमेशा बताया गया था()(); एक अनाम कार्य है। यदि नहीं, तो इसे क्या कहा जाता है? –
'()(); 'का कोई विशेष नाम नहीं है। पहला '()' समूहीकरण ऑपरेटर है जो सामग्री को अभिव्यक्ति के रूप में माना जाता है। इसका उपयोग फ़ंक्शन परिभाषा को अभिव्यक्ति के रूप में लागू करने के लिए किया जाता है और इसे कथन के रूप में नहीं माना जाता है। दूसरा '()' इस मामले में फ़ंक्शन को कॉल करता है लेकिन समूहिंग ऑपरेटर का मूल्यांकन करने का नतीजा एक कार्य नहीं है, तो यह एक त्रुटि होगी। एक अज्ञात फ़ंक्शन बस बिना किसी नाम के फ़ंक्शन होता है। –