2010-12-09 12 views
10

विशेषज्ञों से राय प्राप्त करना चाहता था, मैं एक चर घोषित कर रहा हूं जो मेरे एप्लिकेशन जावास्क्रिप्ट कोड के लिए नामस्थान के रूप में कार्य करेगा, लेकिन मैं यह जांचना चाहता हूं कि यह पहले से नहीं है परिभाषित।जावास्क्रिप्ट सर्वोत्तम अभ्यास परिभाषित चर (नामस्थान) चेक पहले से परिभाषित नहीं है

यह कोड काम करने के लिए terse और 'लगता है' है - किसी भी कारण से मुझे इससे बचना चाहिए और इसके बजाय टाइप 'undef' जांच का उपयोग करना चाहिए?

var MY_NAMESPACE = MY_NAMESPACE || {}; 

धन्यवाद

उत्तर

6

यह ऐसा करने का मानक तरीका है। YUI YAHOO.namespace function के Matt Snider's analysis देखें जो इस चेक का उपयोग करता है (इसके अलावा नामस्थान बनाने में आसान बनाने के तरीके को देखने के लिए)।

मैट कोड है, जिसमें उन्होंने YUI से अनुकूलित YAHOO वस्तु के स्थान पर window वस्तु बंद नाम स्थान के लिए: जो अपने उदाहरण समानताएं

window.object_mes_namespace = function() { 
    var a = arguments,  
     o = window, 
     i = 0, 
     j = 0, 
     tok = null, 
     name = null; 

    // iterate on the arguments 
    for (i = 0; i < a.length; i = i + 1) { 
     tok = a[i].split("."); 

     // iterate on the object tokens 
     for (j = 0; j < tok.length; j = j + 1) { 
      name = tok[j];    
      o[name] = o[name] || {}; 
      o = o[name]; 
     } 
    } 

    return o; 
} 

नोट o[name] = o[name] || {}; लाइन,।

1

यह पहले से ही पसंदीदा तरीका है।

लेकिन आपका कथन कुछ भी नहीं करता है, जब तक कि आप MY_NAMESPACE को किसी अन्य दायरे में रिसाव न करें, क्योंकि MY_NAMESPACEMY_NAMESPACE है।

+1

"किसी अन्य क्षेत्र में लीक करने" का उदाहरण - 'window.MY_NAMESPACE = window.MY_NAMESPACE || {}; ' – jball

3

हालांकि जो भी आपने पोस्ट किया है, आमतौर पर देखा जाता है, मैं व्यक्तिगत रूप से नहीं सोचता कि यह करने का सबसे अच्छा तरीका है। चर वास्तव में परिभाषित किया जा सकता है, लेकिन हो सकता है 0 या false या कोई रिक्त स्ट्रिंग, और आप इस मूल्य की जगह खत्म हो सकता है -

  1. MY_NAMESPACEundefined के अलावा अन्य कई कारणों से गलत पर मूल्यांकन कर सकता है।

  2. MY_NAMESPACE पहले से ही एक वस्तु जा रहा है के अलावा अन्य कई कारणों से सच का मूल्यांकन कर सकता है - यह एक गैर शून्य संख्या या true या एक स्ट्रिंग हो सकता है, और यह, अपनी स्क्रिप्ट चुपचाप विफल हो जाएगा एक के गुणों को जोड़ रहा है क्योंकि बिना त्रुटि के आदिम असफल हो जाएगा।

वास्तव में, सबसे अच्छा तरीका आपके लक्ष्य पर निर्भर करता है। यदि आप एक मौजूदा चर/नामस्थान को दूषित नहीं करना चाहते हैं, तो आप एक typeof जांच करते हैं और अगर चर पहले से ही परिभाषित किया गया है रोक नहीं बल्कि एक वस्तु चाहिए:

if (typeof MY_NAMESPACE == 'undefined') { 
    // create a new namespace 
    MY_NAMESPACE = {}; 
} 

if (typeof MY_NAMESPACE == 'object') { 
    // go ahead 
} else { 
    // MY_NAMESPACE was already defined, but it is not an object 
    // your script will fail if you continue, so do what you must and stop 
} 

यदि आपकी स्क्रिप्ट चाहिए काम करते हैं, बस आँख बंद करके किसी भी चेक के बिना नेमस्पेस बनाएं (बेशक, मैं यह सिफारिश नहीं कर रहा हूं कि आप ऐसा करते हैं)।


संपादित करें: (@ Jball की टिप्पणी के जवाब में, सोचा था कि मैं बस इसे यहां जोड़ा गया) इस नाम स्थान में एक पुस्तकालय है कि आप विकसित कर रहे हैं का हिस्सा है तो

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

  • यदि यह नामस्थान केवल आपके अपने आवेदन के लिए है, तो यह उस नाम को चुनने के लिए काफी सरल होना चाहिए जिसका उपयोग आप किसी भी पुस्तकालय द्वारा उपयोग नहीं कर रहे हैं।

+0

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

+0

इसके अलावा, बिना किसी चेक के अंधेरे से बनाना मतलब है कि आप अपने नेमस्पेस का हिस्सा परिभाषित कर सकते हैं, और उसके बाद इसे बाद में परिभाषित/विस्तारित करते समय इसे ओवरराइट कर सकते हैं ... नामस्थान चेक का बिंदु यह सुनिश्चित करना है कि आपका नेमस्पेस केवल तभी बनाया गया हो अस्तित्व में नहीं है, ताकि आप सुनिश्चित कर सकें कि आपकी सभी जेएस कार्यक्षमता किसी भी फाइल में लिखी गई है, जो सभी नामस्थान में निहित हैं। – jball

+0

@ जेबॉल: मैंने विशेष रूप से उल्लेख किया है कि मैं अंधेरे दृष्टिकोण का सुझाव नहीं दे रहा हूं। नामस्थान के हिस्सों को परिभाषित करने के लिए, 'नेमस्पेस || से ऐसा करने के बेहतर तरीके हैं {} '। – casablanca

1

मुझे YUI example पसंद है और यह मेरे सभी ऐप्स के लिए उपयोग करें। आपके में, आप MY_NAMESPACE को फिर से असाइन कर रहे हैं इससे कोई फर्क नहीं पड़ता कि, जो एक बड़ा सौदा नहीं है, लेकिन यदि आवश्यक नहीं है तो मैं उस असाइनमेंट से बचना पसंद करता हूं।

if (typeof myNamespace == "undefined" || !myNamespace) { 
    var myNamespace = {}; 
} 
+0

मैं उलझन में हूं, आपकी जांच वाईयूआई कोड की जांच से अलग है। ओपी का कोड नामस्थान निर्माण की वाईयूआई शैली के बहुत करीब है। – jball

+0

YUI2 से (टाइप करें याहू == "अपरिभाषित" ||! याहू) { var YAHOO = {}; } – brad

+0

'YAHOO' चर के लिए सच है, लेकिन यह इसके नीचे नामस्थान कैसे बनाता है इसके लिए नहीं। कोड डंप: 'YAHOO.namespace = function() {var a = arguments, o = null, i, j, d; के लिए (i = 0; i jball

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