2012-05-09 18 views
29

मैं चेतावनी देख रहा हूं कि जावास्क्रिप्ट में वैश्विक चर का उपयोग न करें, लेकिन ऐसा लगता है कि लोगों का कहना है कि वैश्विक नामस्थान क्लोज़ का कारण है। मैं कल्पना कर सकता हूं कि यह सभी चर को एक बड़ी वस्तु में डालकर आसानी से तय किया जा रहा है। अब सवाल यह है कि क्या सुविधा के अलावा वैश्विक चर का उपयोग न करने के अन्य कोई कारण हैं? क्या उनके साथ कोई प्रदर्शन या संगतता समस्याएं शामिल हैं?वैश्विक चर क्यों खराब अभ्यास माना जाता है?

+2

संभावित डुप्लिकेट [ग्लोबल्स खराब क्यों हैं?] (Http://stackoverflow.com/questions/4246284/why-are-globals-bad) और [अन्य प्रश्न] (http://stackoverflow.com/search? q = जावास्क्रिप्ट + क्यों + वैश्विक + चर + बुरा + कर रहे हैं)। –

+2

जावास्क्रिप्ट या अन्य भाषाओं, कम मायने रखता है। यहां [कैनोलिक जवाब क्यों है कि ग्लोबल्स खराब क्यों हैं] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)। –

उत्तर

36

वे वैश्विक नामस्थान को अव्यवस्थित करते हैं और स्थानीय चर से देखने के लिए धीमे होते हैं।

सबसे पहले, कई वैश्विक चर होने के कारण हमेशा एक बुरी चीज होती है क्योंकि यह भूलना आसान है कि आपने कहीं एक चर घोषित किया है और गलती से इसे कहीं और घोषित कर दिया है। यदि आपका पहला चर स्थानीय था तो आपको कोई समस्या नहीं है। यदि यह वैश्विक था, तो यह अभी अधिलेखित हो गया। जब आप अंतर्निहित ग्लोबल्स (जब आप someVar = someValue कहते हैं तो var कीवर्ड के साथ कुछ वार घोषित किए बिना यह भी बदतर हो जाता है)।

दूसरा, वैश्विक चरों को जावास्क्रिप्ट के लिए स्थानीय चर से "ढूंढने" के लिए अधिक समय लगता है। गति में अंतर बहुत बड़ा नहीं है, लेकिन मौजूद है।

आगे पढ़ने और ग्लोबल्स को खराब अभ्यास क्यों माना जाता है, इसकी गहराई से स्पष्टीकरण के लिए, आप this page देख सकते हैं।

0

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

(function(){ 
    var foo = 'foo',//Local 
    bar = 'bar';//Local 
    window.globalVar = foo + bar;//Global 
})(); 
alert(foo);//Error 
alert(bar);//Error 
alert(globalVar);//'foobar' 
5

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

यह परिदृश्य और भी दर्दनाक है यदि विभिन्न प्रोग्रामर इस पृष्ठ को आपके पृष्ठ में शामिल अन्य स्क्रिप्ट से संशोधित करते हैं।

+2

हार्डर डीबगिंग केवल एक कारण है कि ग्लोबल्स खराब क्यों हैं। अन्य सूचीबद्ध हैं [ग्लोबल्स इतने बुरे क्यों हैं] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)। –

2

वहाँ अपने कोड में वैश्विक चर का उपयोग कर जब तक आप उन्हें एक uniqe namespase/ऑब्जेक्ट के अंदर लपेटकर कर रहे हैं (स्क्रिप्ट जो आपके नहीं हैं के साथ टकराव से बचने के लिए)

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

मुझे व्यक्तिगत रूप से यह बहुत उपयोगी लगता है और यह निश्चित रूप से मेरे कोड में है।

(बेशक, एक alwayse स्थानीय लोगों और वैश्विक चर के बीच सही संतुलन बनाना चाहिए)

9

वैश्विक चर काफी युग्मन बढ़ा सकते हैं, काफी scalability और अपने कोड की testability कम कर देता है। एक बार जब आप ग्लोबल्स का उपयोग करना शुरू कर देते हैं, तो अब आपको पता होना चाहिए कि चर कहां और कैसे संशोधित किया गया है (यानी ब्रेकिंग encapsulation)। वहां के अधिकांश साहित्य और सम्मेलनों का तर्क होगा कि ग्लोबल्स का उपयोग करते समय प्रदर्शन आपकी कम से कम चिंता का विषय है।

यह fantastic article outlining why वैश्विक चर के कारण सिरदर्द का कारण बनता है।

+3

यह सबसे अच्छा जवाब है। –

2

संक्षेप में, वैश्विक चर निम्नलिखित मुद्दों का कारण बनते हैं (और अधिक)।

1) परिवर्तनीय नामकरण टकराव - यदि आप एक टीम पर काम कर रहे हैं और दोनों स्वयं और आपके सहकर्मी वैश्विक दायरे पर समान वैरिएबल नाम का उपयोग करते हैं, तो अंतिम परिभाषित वैरिएबल प्रारंभिक चर को ओवरराइट करेगा। यह स्पष्ट विनाशकारी परिणाम हो सकता है।

2) सुरक्षा - विशेष रूप से वेब पर, प्रत्येक उपयोगकर्ता को विंडो (या वैश्विक) ऑब्जेक्ट तक पहुंच होती है। वैश्विक दायरे पर चर डालने से, आप किसी भी उपयोगकर्ता को अपने चर को देखने या बदलने की क्षमता देते हैं।

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

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