5

स्टीफानोव के जेएस डिजाइन पैटर्न पुस्तक में, वह लिखते हैं, "आप एक var कथन का उपयोग करते हैं और अल्पविरामों द्वारा सीमित एकाधिक चर घोषित करते हैं", और फिर निम्नानुसार "एकल var" पैटर्न का एक उदाहरण देता है:जावास्क्रिप्ट के नुकसान "एकल var पैटर्न"

function func() { 
    var a = 1, 
     b = 2, 
     sum = a + b, 
     myobject = {}, 
     i, 
     j; 

Stefanov अतिरिक्त लिखते हैं:

  • "यह एक अच्छा अभ्यास भी समय आप यह घोषणा पर एक प्रारंभिक मूल्य के साथ चर प्रारंभ करने में है।"
  • "आप घोषणा के समय कुछ वास्तविक कार्य भी कर सकते हैं, जैसे पिछले कोड में sum = a + b के मामले में।"

अब मैं कुछ कोड इस प्रकार है, एक वर पैटर्न के साथ चर का एक ही नंबर की घोषणा, लेकिन "घोषणा के समय में वास्तविक कार्य" पास बहुत-सी कर रही:

var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
    ,tpl = new Ext.XTemplate(html) 
    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim() 
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 
    ,tplCfg = { 
     purchaseQty: purchaseQty 
     ,fromLoc: fromLoc 
    }; 

घोषणा के समय "वास्तविक काम" करने के नुकसान क्या हैं? बीटीडब्ल्यू मैं इसे Javascript single var pattern. Am I overloading it? का सटीक डुप्लिकेट नहीं मानता क्योंकि मैं केवल अपने कोड के साथ गलत होने के बजाय सामान्य नुकसान के बारे में पूछ रहा हूं।

मुझे लगता है कि मैं देख सकता हूं कि एक सामान्य नुकसान त्रुटियों की जांच करने में असमर्थता होगी, उदाहरण के लिए जहां मेरे उदाहरण में मैं रिकॉर्ड.get से वापस तारों पर ट्रिम() कहता हूं, लेकिन अगर अपरिभाषित हो जाता है, तो "कर सकते हैं अपरिभाषित वस्तु पर कॉल कॉल विधि नहीं है (या जो कुछ भी है;) फेंक दिया जाएगा। क्या कोई और कुछ सोच सकता है?

+0

'trim() 'के साथ समस्या के लिए आप हमेशा अपना खुद का ट्रिम फ़ंक्शन लिख सकते हैं जो जांचता है कि क्या पास हो गया है यह एक स्ट्रिंग है या नहीं। – slebetman

+3

@ स्लेबेटमैन - आपको किसी फ़ंक्शन की आवश्यकता नहीं है: '(record.get ('SRC_SUP_LOC') ||" ")। Trim()' (मानते हुए, प्रश्न के अनुसार, '.get() 'या तो स्ट्रिंग या अपरिभाषित/शून्य)। "जावास्क्रिप्ट, प्रोग्रामिंग शैली और आपके मस्तिष्क" का उल्लेख करने के लिए – nnnnnn

उत्तर

4

किसी कार्य की शुरुआत या वैश्विक कोड की शुरुआत में, दायरे के शीर्ष पर सभी चर घोषित करने का अर्थ है। मैं इस से सहमत हूँ।

जहां तक ​​घोषणा के समय प्रारंभिक मूल्य प्रदान करते हैं, मैं इसे अधिक दिशानिर्देश के रूप में लेता हूं। आम तौर पर यह एक अच्छी योजना है, और निश्चित रूप से सरल मानों के लिए काम करता है, लेकिन कभी-कभी शुरुआती मान कुछ और जटिल गणनाओं के बाद तक ज्ञात नहीं होता है - इस मामले में मैं एक डिफ़ॉल्ट प्रदान नहीं करता जो कभी भी खाद के लिए उपयोग नहीं करता कुछ मूल्य प्रदान करने के लिए। और कभी-कभी यह बहुत गन्दा हो जाता है।

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

जैसा कि आप पहले से ही इंगित कर चुके हैं, अगर आपको अपवादों को संभालने की आवश्यकता है और आगे भी आपको कार्य में भी ऐसा करने की आवश्यकता होगी।

बस कुछ सामान्य ज्ञान का उपयोग करें: यदि आपके पास बहुत सारे चर हैं तो आपको var कथन थोड़ा अपठनीय हो सकता है, इसलिए आप कुछ प्रारंभिकरण को बाद में फ़ंक्शन में स्थानांतरित कर सकते हैं।

मेरे लिए आपका उदाहरण कोड ठीक है, लेकिन यदि आपको इसके लिए और अधिक जोड़ने की आवश्यकता है तो इसे पढ़ने में थोड़ा मुश्किल लगेगा क्योंकि घने ब्लॉक में उस कोड के साथ मैं परिवर्तनीय नामों को आसानी से नहीं चुन सकता , लेकिन - और यह स्पष्ट रूप से स्वाद की बात है, - आप कुछ खाली स्थान के जोड़ सकते हैं:

var html  = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
    ,tpl  = new Ext.XTemplate(html) 

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()  
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 

    ,tplCfg = { 
     purchaseQty: purchaseQty 
     ,fromLoc: fromLoc 
    }; 

5

मैं डगलस क्रॉकफ़ोर्ड के साथ व्यक्तिगत रूप से पक्ष करता हूं (हालांकि मैं उन लोगों की सराहना करता हूं जो इस पर नहीं हैं), जो कि फ़ंक्शन के शीर्ष पर घोषित घोषित करता है, क्योंकि जावास्क्रिप्ट में ब्लॉक स्कोप नहीं है।

JSLint site से:

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

एकमात्र नुकसान यह है कि आपका कोड सी, या सी-आधारित पृष्ठभूमि से आने वाले किसी के लिए कम पठनीय होगा।

मुझे चिंता है कि मैं यहां क्रॉकफोर्ड फैनबॉय की तरह लग सकता हूं, लेकिन मैं recommend this talk on coding style और कभी-कभी आपके दिमाग को कोड संरचना (भाषा के आधार पर) के साथ अपने दिल पर शासन करना चाहिए।

+2

+1। मुझे वह बात पसंद है :-) –

+1

मेरे साथ क्रॉकफोर्ड फैनबोई की तरह लगने की चिंता न करें। मैंने 2003 में comp.lang.javascript * पर अपने एसआईजी में एक लिंक का पालन करके JSON की खोज की * –

0

(अप = संकेत लाइन, या रिक्त लाइनों के साथ समूह से संबंधित चर, या दोनों।) चूंकि यह काफी पुराना है और अब पूरी तरह से प्रासंगिक नहीं है, इसलिए यह es6 दुनिया से आने वाले लोगों को इंगित करना उपयोगी है कि अब हमारे पास ब्लॉक स्कोप है आईएनजी।

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