2010-11-22 11 views
12

यह मुझे यहां उपयोग करने के लिए समझ में आता है। वैकल्पिक विकल्प क्या होगा? मैं सामान्य रूप से उनका उपयोग करने से कैसे बच सकता हूं और अधिकांश में ग्लोबल्स का उपयोग करने के लिए जेएसलिंट के अनुसार यह बुरा क्यों है।ग्लोबल्स क्यों खराब हैं?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

क्या आप इसे समझने में मेरी सहायता कर सकते हैं? और मुझे एक बेहतर समाधान दे?

उत्तर

18

वैश्विक बुरा कर रहे हैं क्योंकि वे समस्याओं का तुरंत कारण नहीं है। केवल बाद में, आप उन्हें पूरी जगह पर इस्तेमाल करने के बाद, वे बहुत बदसूरत समस्याएं पैदा करेंगे - जिन्हें आप स्क्रैच से अपना कोड लिखने के बिना और हल नहीं कर सकते हैं।

उदाहरण: आप कुछ कार्यों को परिभाषित करने के लिए $body का उपयोग करते हैं। यह ठीक काम करता है। लेकिन अंततः, आपको एक मूल्य की भी आवश्यकता है। तो आप $body.foo का उपयोग करें। ठीक काम करता है। फिर आप $body.bar जोड़ें। और फिर, सप्ताह बाद, आपको एक और मूल्य की आवश्यकता है ताकि आप $body.bar जोड़ सकें।

आप कोड का परीक्षण करते हैं और ऐसा लगता है कि यह काम करता है। लेकिन वास्तव में, आपने दो बार एक ही चर "जोड़ा" है। यह कोई समस्या नहीं है क्योंकि जावास्क्रिप्ट "एक बार एक नया चर बनाने" की अवधारणा को समझ में नहीं आता है। यह सिर्फ "जानता है जब तक कि यह पहले से मौजूद नहीं है।" तो आप अपने कोड का उपयोग करते हैं और अंततः, एक फ़ंक्शन $body.bar को किसी अन्य फ़ंक्शन को तोड़ देगा। समस्या को खोजने के लिए भी आपको बहुत समय लगेगा।

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

2

आप,, वर $ शरीर के साथ यह परिभाषित करना चाहिए तो यह है कि समारोह के दायरे में स्थानीय होगा वर के बिना यह सब लोग द्वारा ओवरराइट किया जा सकता है

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

या कुछ 'अन्य' वैश्विक चर $ शरीर – Mchl

+0

हाँ कहा जाता है के ऊपर लिख, लेकिन इस उदाहरण में यह वैश्विक मूल्य की जगह लेंगे, इस तरह से यह केवल समारोह – mpapis

+2

एक समारोह शाब्दिक स्थानीय चर कि में घोषित किया गया का उपयोग कर के दायरे में यह खाल फ़ंक्शन को परिभाषित करने के समान स्कोप को [क्लोजर] (http://jibbering.com/faq/notes/closures/) कहा जाता है, और इसका उपयोग jQuery में बड़े प्रभाव के लिए बड़े पैमाने पर किया जाना चाहिए। – Phrogz

2

Globale चर अन्य लिपियों के साथ संघर्ष कर सकता है या ओवरराइट किया । जब आपको वैश्विक की आवश्यकता नहीं होती है, तो उनसे बचने के लिए सलाह दी जाती है। सीधे शब्दों में var का उपयोग (या let अगर आपके जे एस-संस्करण-समर्थन 1.7 से अधिक है):

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

आप को फिर से लिखने के रूप में हो सकता है कि

var $body = $('body'); 

कि (var कीवर्ड के उपयोग) यह होगा एक स्थानीय चर, जो आपके उद्देश्यों के लिए पर्याप्त है। यह अभी भी आपके each कॉलबैक में दायरे के भीतर होगा।

ग्लोबल्स का उपयोग करना बुरा होने का कारण यह है कि इसे किसी और चीज से ओवरराइट किया जा सकता है। आपके कोड को अच्छी तरह से स्केल करने के लिए, यह आपके द्वारा उपयोग की जाने वाली अन्य स्क्रिप्ट पर निर्भर हो जाता है। स्क्रिप्ट को यथासंभव आत्मनिर्भर रखने के लिए बेहतर है, जितना संभव हो उतना निर्भर निर्भरताएं इसके बाहर की दुनिया को इंगित करती हैं।

0

जेएसलिंट बहुत कठोर है। इसके बारे में बहुत लटका पाने के लिए शायद जरूरी नहीं है।

लेकिन अगर आप बुरा लग रहा है, तो आप इसे ठीक वैसे ही जैसा कि कैसे आप jQuery scoped कर सकते हैं:

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

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

+0

@ डेविड हेडलंड: सहमत – kizzx2

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