2012-04-27 15 views
6

जावास्क्रिप्ट में, नामस्थान और बंद होने के बीच क्या अंतर है? वे मेरे जैसा बहुत प्रतीत होते हैं।जावास्क्रिप्ट - नामस्थान बनाम बंद करने के बीच अंतर?

संपादित

विशेष रूप से, this article नामस्थान और संवृति चर्चा करता है, और

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

यह क्या, एक बंद की तरह एक बहुत लग रहा है एक "वस्तु नाम स्थान" के रूप में देने के लिए चला जाता है। ऐसा लगता है कि नामस्थान एक closure है ... लेकिन शायद यह नहीं है ...? मदद?

+1

"नामस्थान" की अपनी परिभाषा पर विस्तृत करें। –

+0

जावास्क्रिप्ट में नामस्थान नहीं हैं। उस शब्द से आपका क्या मतलब है? –

+1

जावास्क्रिप्ट में "नेमस्पेस" का कोई भी अर्थ नहीं है क्योंकि प्रतीकों को रिक्त स्थान (बंद करने सहित) को अलग करने के कार्य को पूरा करने के कई तरीके हैं। कुछ कोड दिखाएं –

उत्तर

23

एक नाम स्थान अनिवार्य रूप से कोई दिलचस्प गुण है कि आप में सामान फेंकना तो आप समान और/या अपने दायरे के आसपास चल रहा है परस्पर विरोधी नाम के साथ चर का एक गुच्छा नहीं है के साथ एक Object है। तो, उदाहरण के लिए, की तरह

MyNS = {} 
MyNS.x = 2 
MyNS.func = function() { return 7; } 

कुछ जब एक समारोह 'को बरकरार रखे हुए' ए बंद है चर है कि यह में परिभाषित नहीं कर रहे हैं के मूल्यों, भले ही वे चर क्षेत्र से बाहर चले गए हैं। समझें:

function makeCounter() { 
    var x = 0; 
    return function() { return x++; } 
} 

अगर मैं c = makeCounter() जाने और फिर बार-बार c() कहते हैं, मैं 0, 1, 2, 3, ... मिलेगा। ऐसा इसलिए है क्योंकि makeCounterx पर 'बंद' को परिभाषित करता है, इसलिए इसका संदर्भ है, भले ही x दायरे से बाहर है।

विशेष रूप से, अगर मैं तो d = makeCounter(), d() 0. से गिनती इसका कारण यह है c और dx के विभिन्न उदाहरणों मिल शुरू कर देंगे।

+0

यह वास्तव में एक अच्छा जवाब है - धन्यवाद! हालांकि इसे कुछ समय देना होगा :) – Ben

+0

+1 मैं अंततः बंद करने को समझता हूं (और मैंने 2-3 ट्यूटोरियल की तरह कोशिश की है और हमेशा छोड़ दिया है) – ajax333221

+0

हाँ, यह मैंने देखा है बंद होने का सबसे संक्षिप्त और सहायक स्पष्टीकरण है - धन्यवाद! अब मैं समझ गया। – iono

5

एक नामस्थान आमतौर पर एक मास्टर ग्लोबल वैरिएबल के तहत गुणों के रूप में आपके सभी वैश्विक चर डालने का एक तरीका है, इस प्रकार केवल एक नया वास्तव में शीर्ष-स्तरीय वैश्विक चर जोड़ता है। यह वैश्विक नामस्थान के प्रदूषण को रोकता है और अन्य वैश्विक चर के साथ संघर्ष का मौका कम कर देता है।

और एक नाम स्थान का उदाहरण:

var YUI = {}; 
YUI.one = function(sel) {...}; 
YUI.two = function(sel) {...}; 
YUI.three = function(sel) {...}; 

वहाँ शीर्ष स्तर के वैश्विक नामस्थान YUI में एक नया आइटम है, लेकिन YUI नाम स्थान वस्तु के माध्यम से कई विश्व स्तर पर सुलभ आइटम हैं।

एक बंद एक फ़ंक्शन ब्लॉक है जो फ़ंक्शन के आंतरिक हिस्सों के स्थायी संदर्भों के कारण फ़ंक्शन के निष्पादन की सामान्य समाप्ति से परे रहता है।

function doSometing() { 
    var x = 10; 
    setTimer(function() { 
     // this gets called after doSomething() has finished executing 
     // but because of the function closure, the variables 
     // inside of the parent scope like x are still accessible 
     x += 10; 
    }, 1000); 
} 
2
http://jibbering.com/faq/notes/closures/ से

:

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

नामस्थान केवल एक सम्मेलन हैं, जो चर के साथ वैश्विक दायरे को छेड़छाड़ से बचने के लिए बनाए गए हैं।

+0

एसओ, @ गेफ्रीहिंग में आपका स्वागत है! मदद के लिए धन्यवाद लेकिन मुझे लगता है कि "बंद" अनुच्छेद अत्यधिक जटिल और बेहद उलझन में है ... लेकिन नामस्थान स्पष्टीकरण स्पष्ट और संक्षिप्त है, +1। – Ben

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