का उद्देश्य closures
केवल राज्य को संरक्षित करना है; इसलिए नाम closure
- यह राज्य के ऊपर बंद हो जाता है। आगे की व्याख्या में आसानी के लिए, मैं जावास्क्रिप्ट का उपयोग करूँगा।
आमतौर पर आपके पास एक फ़ंक्शन होता है
function sayHello(){
var txt="Hello";
return txt;
}
जहां चर का दायरा इस फ़ंक्शन के लिए बाध्य है। इसलिए निष्पादन के बाद चर txt
दायरे से बाहर हो जाता है। फ़ंक्शन के निष्पादन के बाद इसे एक्सेस करने या इसका उपयोग करने का कोई तरीका नहीं है।
क्लोज़र भाषा निर्माण हैं, जो अनुमति देते हैं - जैसा कि पहले कहा गया था - चर की स्थिति को संरक्षित करने और इसलिए गुंजाइश को लम्बा खींचने के लिए।
यह विभिन्न मामलों में उपयोगी हो सकता है। एक उपयोग मामला उच्च आदेश कार्यों का निर्माण है ।
गणित और कंप्यूटर विज्ञान में, एक उच्च-क्रम फ़ंक्शन (कार्यात्मक रूप, कार्यात्मक या फ़ंक्टर) भी एक फ़ंक्शन है जो निम्न में से कम से कम एक करता है: 1
- इनपुट के रूप में एक या अधिक कार्य करता है
- एक फ़ंक्शन को आउटपुट करता है
एक सरल, लेकिन सराहनीय रूप से सभी उपयोगी उदाहरण नहीं है:
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
आप एक फ़ंक्शन को परिभाषित करते हैं makedadder
, जो इनपुट के रूप में एक पैरामीटर लेता है और एक फ़ंक्शन देता है । एक बाहरी फ़ंक्शन function(a){}
और एक आंतरिक है function(b){}{}
। आपके द्वारा add5
उच्चतर क्रमिक म्यूटेशन को कॉल करने के परिणामस्वरूप एक अन्य फ़ंक्शन को परिभाषित किया जाता है makeadder
। makeadder(5)
एक अनाम ( आंतरिक ) फ़ंक्शन देता है, जो बदले में 1 पैरामीटर लेता है और बाहरी फ़ंक्शन के पैरामीटर और आंतरिक फ़ंक्शन के पैरामीटर का योग देता है ।
चाल है कि लौटने जबकि, है आंतरिक समारोह है, जो वास्तविक जोड़ने करता है, बाहरी समारोह के पैरामीटर के दायरे ( a
) संरक्षित है। add5
याद है , कि पैरामीटर a
था 5
।
या कम से कम किसी तरह उपयोगी उदाहरण दिखाने के लिए:
makeTag=function(openTag, closeTag){
return function(content){
return openTag +content +closeTag;
}
}
table=makeTag("<table>","</table>")
tr=makeTag("<tr>", "</tr>");
td=makeTag("<td>","</td>");
console.log(table(tr(td("I am a Row"))));
एक अन्य सामान्य यूएससेक तथाकथित आईआईएफई = तुरंत फंक्शन एक्सप्रेशन है। यह जावास्क्रिप्ट में नकली निजी सदस्य चर के लिए बहुत आम है । यह एक फ़ंक्शन के माध्यम से किया जाता है, जो एक निजी गुंजाइश बनाता है = closure
, क्योंकि यह परिभाषा लागू होने के तुरंत बाद है। संरचना है function(){}()
। ()
परिभाषा के बाद कोष्ठक पर ध्यान दें । यह मॉड्यूल पैटर्न का खुलासा करने के साथ ऑब्जेक्ट-निर्माण के लिए इसका उपयोग करना संभव बनाता है । चाल एक गुंजाइश बना रही है और एक वस्तु लौटा रही है, जिसे आईआईएफई के निष्पादन के बाद इस दायरे तक पहुंच है।
Addi का उदाहरण इस तरह दिखता है:
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
लौटी हुई वस्तु में फ़ंक्शंस (उदाहरण publicSetName
) के संदर्भ होते हैं , जिसमें बदले में "निजी" चर होते हैं privateVar
।
लेकिन ये जावास्क्रिप्ट के लिए अधिक विशेष उपयोग के मामले हैं।
एक प्रोग्रामर क्या विशिष्ट कार्य करेगा जो एक बंद द्वारा सबसे अच्छा काम किया जा सकता है?
उसके कई कारण हैं। एक हो सकता है, कि यह उसके लिए स्वाभाविक है, क्योंकि वह एक कार्यात्मक प्रतिमान का पालन करता है । या जावास्क्रिप्ट में: भाषा के कुछ सवालों को दरकिनार करने के लिए बंदियों पर भरोसा करना केवल आवश्यकता है।