2010-07-20 9 views
13

जावास्क्रिप्ट बंद होने के आसपास अपने सिर को लपेट रहा हूं और उस बिंदु पर हूं जहां चीजें घट रही हैं; जिंदा समारोह वापस आ गया है के बाद रखा, या को बंद करने की एक ढेर फ्रेम जो जब समारोह रिटर्न पुनः आवंटित की जाती नहीं है - यानी को बंद करने के लिए एक समारोह स्थानीय चर है।हमारे पास जावास्क्रिप्ट में बंद क्यों है?

इस अवधारणा को समझने के लिए शुरू कर रहा हूँ, लेकिन अधिक मैं और अधिक सोच पर मैं रखने के समझ में क्यों हम उन्हें इस्तेमाल करने की क्या ज़रूरत है।

इस तरह एक उदाहरण मुझे अवधारणा को समझने में आता है लेकिन मुझे पूछ छोड़ देता है, वहाँ ऐसा करने का एक सरल तरीका है!

function sayHello(name) { 
    var text = 'Hello ' + name; 
    var sayAlert = function() { alert(text); } 
    sayAlert(); 
} 
sayHello('Gath'); 

मुझे आश्चर्य है कि मुझे स्थानीय चर को जिंदा रखने के लिए क्यों करना है? समारोह समाप्त हो जाने के बाद?

मैं कहाँ उदाहरण बंद द्वारा कार्यान्वित समाधान के दिखा और बाकी कि कुछ भी नहीं काम किया लेकिन बंद है | मिल सकता है?

+7

उत्तर के एक महान बैच के लिए यहां देखें: http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work –

उत्तर

7

क्लोजर भाषा को अभिव्यक्तिपूर्ण शक्ति जोड़ते हैं। कुछ पैटर्न हैं जिन्हें बंद करने के कारण बहुत आसानी से कार्यान्वित किया जा सकता है। कुछ उदाहरण है कि मन के लिए आते हैं शामिल हैं:

  • The Module Pattern - द्वारा एरिक Miraglia
  • Memoization उदाहरण - उदाहरण द्वारा ओलिवर स्टील
  • Currying - डस्टिन Diaz द्वारा उदाहरण
0

उदाहरण आपके द्वारा चुने गए this page पर दिखाई देता है, तो मुझे लगता है आप उसे वहां से ले लिया। क्या आपने यह उपलब्ध अन्य सभी उदाहरणों को देखा है? वे संभवतः बंद होने से बेहतर बंद करने के लिए प्रेरणा की व्याख्या करते हैं।

+0

हाँ मैंने किया, लेकिन फिर भी वे एक परिदृश्य प्रदर्शित नहीं करते हैं बाकी सब कुछ असफल रहा और बंद करना एकमात्र चीज थी जो चाल – gath

+0

@gath - हाँ वे कर सकती थी। उनमें से कई उदाहरण ऐसे कार्य हैं जिनके पास अन्य कार्य उनके वापसी मूल्य के रूप में हैं। यदि आप बाहरी फ़ंक्शन को कॉल करते हैं, तो लौटाए गए फ़ंक्शन का संदर्भ सहेजें, और उसके बाद कुछ फ़ंक्शन पर लौटाए गए फ़ंक्शन को कॉल करें, वे उदाहरण संभवतः बंद किए बिना काम नहीं कर पाएंगे। –

+0

@gath: सब कुछ असेंबलर में लिखा जा सकता है। क्लोजर का आविष्कार उन समस्याओं को हल करने के लिए नहीं किया गया था जिन्हें पहले कभी हल नहीं किया जा सकता था, इसलिए आपको कोई समस्या नहीं मिलेगी जिसे केवल बंद करने के साथ हल किया जा सकता है। वे कुछ समस्याओं को सुलझाने के लिए बहुत आसान बनाते हैं, और यदि आप इन उदाहरणों को ध्यान में रखते हुए संशोधित करते हैं, तो वे आपको अधिक समझने लग सकते हैं। –

2

एक बंद सभी environnement की जरूरत के लिए यह निष्पादित किया जाना है के साथ एक समारोह है। जावास्क्रिप्ट में, यह तब होता है जब एक अज्ञात फ़ंक्शन (= लैम्ब्डा) बनाया जाता है, बाहरी चर से एक चर का उपयोग कर।

function foo() 
{ 
    var text = computeFromOutside(); 
    // ... other lines of code 
    return function(otherText) { return text + otherText; } 
} 

bar = foo(); 

function baz(fun) 
{ 
    return fun("some text"); 
} 

यहाँ, आप एक समारोह स्थानीय चर "पाठ" का उपयोग करता है लौट रहे हैं:

बेहतर होगा कि तुम क्यों इस तरह एक कोड के साथ समझ सकते हैं। इसलिए, आप foo फ़ंक्शन स्कोप छोड़ रहे हैं, इसके चर को नष्ट कर रहे हैं। हालांकि, चूंकि हमारे पास टेक्स्ट का उपयोग करके एक अनाम कार्य है, इसलिए हमें इस चर का ट्रैक रखना होगा। यह भाषा के आधार पर मूल्य या संदर्भ द्वारा प्राप्त किया जा सकता है (परिवर्तनीय जीवित रखना (इसके बाद इसे संशोधित करने की संभावना के साथ, या फ़ंक्शन बनने पर इसके मूल्य की प्रतिलिपि बनाना))।

मुझे आशा है कि इससे मदद मिलती है!

0

एक सामान्य कार्य अपने करता है चीज, परिणाम की गणना करता है और इसे वापस करता है। बंद करने के बाद, आप अपने काम को अलग-अलग तरीके से पैकेज कर सकते हैं, और कॉलर्स को इसके लिए तैयार होने पर और अधिक प्राप्त करने दें। चूंकि मैंने विश्वविद्यालय में Scheme की कोशिश की है, इसलिए मैं उस भाषा के बंद होने के लिए परेशान रहा हूं जिसके बाद से मैंने काम किया है ... वे खतरनाक रूप से आदत बना रहे हैं!

वे तर्कसंगत रूप से भविष्य का एक महत्वपूर्ण हिस्सा भी हैं: अन्य कार्यात्मक प्रोग्रामिंग तंत्र के साथ-साथ बहु-कोर सिस्टम के समानांतर प्रोग्रामिंग के लिए एक अच्छा फिट लगता है।

2

"एक बंद एक गरीब व्यक्ति की वस्तु है। एक वस्तु एक गरीब व्यक्ति का बंद है।" (क्षमा करें, मैं स्रोत भूल गया)।

कभी-कभी हमें उन चरों की आवश्यकता होती है जिन्हें केवल एक कोड के ब्लॉक की आवश्यकता होती है। हमने उस फंक्शन में कोड के ब्लॉक को रखा है और उस चर में स्थानीय चर के रूप में वे चर हैं।

कभी-कभी हमें सभी प्रोग्राम में फ़ंक्शन/ब्लॉक-कोड द्वारा आवश्यक चर की आवश्यकता होती है। हम इन चर को वैश्विक चर के रूप में प्राप्त कर सकते हैं।

कभी-कभी हमें कुछ फ़ंक्शंस/ब्लॉक-कोड द्वारा आवश्यक चर की आवश्यकता होती है। उदाहरण के लिए हमारे पास बिक्री नामक एक इकाई है और हम अपने सभी बिक्री संबंधित कोड को एक साथ रखना चाहते हैं। तो हमारे पास फ़ंक्शंस का एक समूह और चर के समूह हैं जो बिक्री से संबंधित हैं। हम इन कार्यों और चर को किसी ऑब्जेक्ट में एक साथ रख सकते हैं, ताकि वे कोड के अन्य हिस्सों से पृथक (दोनों कार्य और चर) हों।

ऐसी भाषाओं में जो सीधे ऑब्जेक्ट्स का समर्थन नहीं करते हैं, हम घोंसला वाले कार्यों को प्राप्त कर सकते हैं। बाहरी कार्य वर्ग की तरह कार्य करता है, आंतरिक कार्य विधियों की तरह कार्य करता है। बाहरी फ़ंक्शन के लिए स्थानीय चर फ़ील्ड की तरह कार्य करता है, वे केवल आंतरिक कार्यों तक पहुंच योग्य होते हैं। आंतरिक कार्यों के बाद की कॉल में, हम स्थानीय-से-बाहरी-फ़ंक्शन चर की स्थिति को बनाए रखना चाहते हैं, यह वह जगह है जहां बंद करने की आवश्यकता होती है। हमें बस इतना करना है कि बाहरी फ़ंक्शन के बाहर कोड के लिए बाहरी फ़ंक्शन के आउटपुट के माध्यम से किसी भी आंतरिक फ़ंक्शन का संदर्भ पास किया जाए, ताकि बाहरी फ़ंक्शन से बाहर निकलने वाले बाहरी फ़ंक्शन के चर को बाहरी फ़ंक्शन से बाहर रखा जा सके।

+0

यह एक उत्कृष्ट सादृश्य है – qodeninja

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