एक बंद मूल रूप से एक समारोह बी एक समारोह एक है कि एक के स्थानीय चर का उपयोग कर सकते अंदर नेस्टेड है। जब हम ए द्वारा लौटाए गए फ़ंक्शन को कॉल करने का प्रयास करते हैं, तो x
क्या इसका उल्लेख होगा? A()
समाप्त होने के बाद से अमान्य नहीं होगा?
उत्तर यह है कि x
वास्तव में रहता है। वह B
हम वास्तव में इसके साथ लगभग x
लेते हैं। अच्छा, आह?
अधिक सामान्य अर्थ में, एक बंद कुछ डेटा के लिए एक कार्य है। सी जैसे बंद होने के बिना किसी भाषा में, प्रत्येक कार्यक्रम में निश्चित संख्या में कार्य होते हैं। बंद होने के साथ, आप एक अर्थ में, गतिशील डेटा को बाध्य करके "फ़ंक्शन बनाएं" कर सकते हैं। बेशक, कोई भी आपको सी में बंद करने के अनुकरण से रोक नहीं रहा है, लेकिन कभी-कभी दर्द हो सकता है।
क्लोजर वास्तव में उपयोगी हैं। उदाहरण के लिए, मान लीजिए हम अपने "पाश के लिए" खुद लागू करना चाहते हैं:
function loop(count, f) {
for (var i = 0; i < count; i++)
f(i);
}
var array = [0,1,2,3,4];
loop(5, function(i) {
print(array[i]);
});
अतिरिक्त बकवास का एक समूह ऐसा किए बिना बाहर चर का उपयोग करने की अनुमति दी जा रही कोड अच्छा और सरल रहता है। बंद के बिना, आप के बजाय loop
कार्य करने के लिए एक संदर्भ चर पारित करने के लिए हो सकता है:
function loop(count, f, ctx) {
for (var i = 0; i < count; i++)
f(i, ctx);
}
var array = [0,1,2,3,4];
loop(5, function(i, ctx) {
print(ctx[i]);
}, array);
एक और उदाहरण: मान लीजिए हम jQuery में एक कॉलबैक पंजीकृत करना चाहते हैं, लेकिन यह लंबे समय तक समारोह और उसके फोन करने वाले के बाद क्रियान्वित किया जा सकता है और अपने फोन करने वाले का फोन करने वाले से चल रहा से किया जाता है:
$(document).ready(function(){
var clicked = 0;
$('#button').click(function(){
clicked++;
alert("You've pressed the button " + clicked + " times.");
});
});
तो जावास्क्रिप्ट गया अधिक सी की तरह ++ (C++ 0x से पहले), कि clicked
चर लंबे समय से चला की जाएगी समारोह $(document).ready()
करने के लिए दिया जाता था, और बटन पर क्लिक कॉलबैक में अपरिभाषित व्यवहार होगा।
प्रश्न http://stackoverflow.com/questions/36636/what-is-a-closure और http://stackoverflow.com/questions/1095707/what-is-the-exact-definition-of-a- बंद इस –