एंडी ह्यूम काफी gave जवाब है, मैं तो बस कुछ और विवरण जोड़ना चाहते हैं।
इस निर्माण के साथ आप अपने मूल्यांकन वातावरण या बंद होने के साथ एक अनाम कार्य बना रहे हैं, और फिर आप इसका तुरंत मूल्यांकन करते हैं। इसके बारे में अच्छी बात यह है कि आप अज्ञात फ़ंक्शन से पहले घोषित चरों तक पहुंच सकते हैं, और आप स्थानीय चर का उपयोग इस फ़ंक्शन के अंदर किसी मौजूदा चर को गलती से ओवरराइट किए बिना कर सकते हैं।
वर कीवर्ड का उपयोग बहुत महत्वपूर्ण है, क्योंकि जावास्क्रिप्ट में हर चर डिफ़ॉल्ट रूप से वैश्विक है, लेकिन कीवर्ड के साथ आप एक नया, lexically scoped चर बनाने, कि है, यह कोड से दिखाई दे रहा है दो ब्रेसिज़ के बीच। आपके उदाहरण में, आप अनिवार्य रूप से वाईयूआई पुस्तकालय में वस्तुओं के लिए लघु उपनाम बना रहे हैं, लेकिन इसमें अधिक शक्तिशाली उपयोग हैं।
मैं एक कोड उदाहरण के बिना आप छोड़ने के लिए नहीं करना चाहते, इसलिए मैं यहाँ एक सरल उदाहरण एक बंद वर्णन करने के लिए डाल देता हूँ:
var add_gen = function(n) {
return function(x) {
return n + x;
};
};
var add2 = add_gen(2);
add2(3); // result is 5
यहाँ क्या चल रहा है? फ़ंक्शन add_gen आप एक और फ़ंक्शन बना रहे हैं जो इसके तर्क के लिए n नंबर जोड़ देगा।चाल यह है कि फंक्शन पैरामीटर सूची में परिभाषित चर में अक्षरों को स्केल किए गए चर के रूप में कार्य करते हैं, जैसे var के साथ परिभाषित किए गए।
लौटे समारोह ब्रेसिज़add_gen समारोह के बीच परिभाषित किया गया है तो यह की n मूल्य के बाद भी add_gen समारोह का निष्पादन पूरा होने के लिए उपयोग होगा, वह यह है कि जब क्रियान्वित कारण है कि आप 5 मिल जाएगा उदाहरण की आखिरी पंक्ति।
फ़ंक्शन पैरामीटर की मदद से
lexically scoped जा रहा है, आप के चारों ओर "समस्याओं" गुमनाम कार्यों में पाश वैरिएबल का उपयोग से उत्पन्न होने वाले काम कर सकते हैं। एक साधारण उदाहरण लें:
for(var i=0; i<5; i++) {
setTimeout(function(){alert(i)}, 10);
}
"उम्मीद" परिणाम शून्य से चार नंबर हो सकता है, लेकिन आप के बजाय फाइव्स के चार उदाहरणों मिलता है। यह इसलिए होता है क्योंकि setTimeout में अज्ञात फ़ंक्शन और पाश के लिए बहुत ही प्रयोग कर रहे हैंमैं चर, और समय के कार्यों का मूल्यांकन करने के लिए, मैं हो जाएगा 5.
आप मिल भोलेपन से उम्मीद कर सकते हैं आपके प्रश्न और तथ्य में तकनीक का उपयोग करके परिणाम, कि फ़ंक्शन पैरामीटर शब्दावली से स्कॉप्ड हैं। (मैं एक other answer में इस दृष्टिकोण का उपयोग किया है)
for(var i=0; i<5; i++) {
setTimeout(
(function(j) {
return function(){alert(j)};
})(i), 10);
}
बाहरी समारोह के तत्काल मूल्यांकन आप एक पूरी तरह से स्वतंत्र प्रत्येक चरण में जे नामित चर बना रहे हैं तथा के वर्तमान मूल्य के साथ मैं होगा इस चर में की प्रतिलिपि बनाई गई है, इसलिए आपको परिणाम प्राप्त होगा जो पहली कोशिश से नैतिक रूप से अपेक्षित था।
मेरा सुझाव है, वह यह है कि जहां मैं बहुत-बहुत बहुत कुछ सीखा आप http://ejohn.org/apps/learn/ पर उत्कृष्ट ट्यूटोरियल को समझने के लिए बंद बेहतर समझने की कोशिश करने के लिए।
मुझे लगता है कि हमें डुप्लिकेट दोनों की आवश्यकता है, क्योंकि उन्हें इतना अलग कहा गया है। –
यह हटाने का एक अच्छा कारण नहीं है, लेकिन मुझे नहीं पता कि हम डुप्लिकेट के रूप में क्यों नहीं बंद कर सकते हैं। –
इस पर भी चर्चा की गई है [फ़ंक्शन() {})() के बीच अंतर; और फ़ंक्शन() {}();] (http://stackoverflow.com/questions/423228/difference-between-function-and- कार्यक्षमता)। –