2012-08-20 21 views
6

यहां कुछ सीधे प्राप्त करना चाहते हैं ... इसलिए मेरे पास 2 प्रश्न हैंक्या ये जावास्क्रिप्ट बंद होने के लिए माना जाता है?

नीचे दिया गया कार्य बंद हो जाता है।

function Foo(message){ 
    var msg = message; 

    return function Bar(){ 
     this.talk = function(){alert(msg); } 
    } 
}; 

प्रश्न: कौन से समारोह बंद, Foo या Bar है?
मैंने हमेशा Foo होने का बंद होने का विचार किया, क्योंकि Bar एक बार Bar बंद हो गया है।

()(); 

प्रश्न:: है इस अनाम समारोह भी एक बंद के भीतर आंतरिक समारोह

अगले ...

नीचे एक गुमनाम समारोह की परिभाषा है?

(function(){ /* <-- Is this function also a closure? */ })(); 
+0

आपको अपने प्रश्न में उन '
' टैग की आवश्यकता नहीं है। इसके अलावा, '()(); 'बिल्कुल अज्ञात फ़ंक्शन की परिभाषा नहीं है। – Pointy

+0

@ प्वाइंट धन्यवाद, मुझे हमेशा बताया गया था()(); एक अनाम कार्य है। यदि नहीं, तो इसे क्या कहा जाता है? –

+1

'()(); 'का कोई विशेष नाम नहीं है। पहला '()' समूहीकरण ऑपरेटर है जो सामग्री को अभिव्यक्ति के रूप में माना जाता है। इसका उपयोग फ़ंक्शन परिभाषा को अभिव्यक्ति के रूप में लागू करने के लिए किया जाता है और इसे कथन के रूप में नहीं माना जाता है। दूसरा '()' इस मामले में फ़ंक्शन को कॉल करता है लेकिन समूहिंग ऑपरेटर का मूल्यांकन करने का नतीजा एक कार्य नहीं है, तो यह एक त्रुटि होगी। एक अज्ञात फ़ंक्शन बस बिना किसी नाम के फ़ंक्शन होता है। –

उत्तर

4

आपको यहां पहले सिद्धांतों का उपयोग करने की आवश्यकता है। जावास्क्रिप्ट लेक्सिकल स्कोपिंग का उपयोग करता है। इसका मतलब है कि निष्पादन संदर्भ का दायरा यह निर्धारित करता है कि कोड परिभाषित (शब्दावली) कैसे है।

मैं कहूंगा कि समारोह 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 का उपयोग करता है।

+0

आपका मतलब है "... जब फू उत्साहित होता है।" मुझे लगता है। – Pointy

+1

आपका मतलब क्या है? 'बार' का अस्तित्व और 'msg' का उपयोग बंद होने का कारण बनता है। – hvgotcodes

1

Bar बंद है।

हम कहते हैं कि Bar पर अपने पर्यावरण में msg से अधिक बंद हो जाता है।

अक्सर बंद का अर्थ है: एक फ़ंक्शन जो कम से कम एक चर का उपयोग करता है जिसे एक संलग्न कार्य में परिभाषित किया गया है, एक संलग्न कार्य में।

अपने दूसरे प्रश्न का उत्तर देने के लिए: (function(){ ... })() बस ऐसा लगता है: एक अनाम कार्य, दो नहीं। जब तक कि यह किसी अन्य फ़ंक्शन के अंदर घोंसला न हो, आप आमतौर पर इसे बंद नहीं करेंगे। हालांकि, उस अज्ञात फ़ंक्शन के अंदर घोंसले वाले कार्य बंद हो सकते हैं (और अक्सर होते हैं)।

+0

+1 सही जवाब के लिए +1 ... काश मैं दो जवाबों के लिए मतदान कर सकता हूं। –

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