2012-03-07 21 views
56

मैं उनके मॉड्यूल परिभाषाओं में इस्तेमाल अनाम प्रक्रियाएं में एक पैरामीटर के रूप jQuery और संबंधित jQuery.UI पास undefined की तरह मुख्य वक्ता के रूप प्लगइन्स देखा है, इसलिए जैसे:गुजरने का उद्देश्य क्या है?

(function($, undefined) { ... })(jQuery); 

वैकल्पिक रूप से, मैंने देखा है अन्य प्लग-इन jQuery और/या अन्य लोगों द्वारा की सिफारिश पैरामीटर के रूप में अपरिभाषित पास न करें।

यह शायद एक मूर्खतापूर्ण सवाल है, लेकिन ...

यह हमेशा वैसे भी उपलब्ध हो नहीं करना चाहिए? इसे क्यों पास करें? क्या यहां कोई अन्य उद्देश्य या चाल चल रही है?

उत्तर

68

वहाँ उस के लिए दो कारण हैं।

2) ईएस 5 *, undefined लिखने से पहले वैश्विक वस्तु की संपत्ति थी। तो इसे ओवरराइट किया जा सकता है, जिसके परिणामस्वरूप अजीब और अप्रत्याशित व्यवहार होता है। आप कुछ इस तरह कर सकता है:

var test = 123; 
undefined = 123; 
if (test === undefined){ 
    // this will actually be true, since undefined now equals 123 
} 

एक समारोह तर्क undefined (नाम वास्तव में कोई फर्क नहीं पड़ता है), जो आप एक पैरामीटर उत्तीर्ण नहीं होते हैं, आप कर सकते हैं करने के लिए होने से सुनिश्चित करें कि आप एक चर जो वास्तव में undefined है तो आप इस चर के खिलाफ "अनिश्चितता" का परीक्षण कर सकते हैं।

बीटीडब्ल्यू।अपरिभाषित के लिए परीक्षण करने के लिए सबसे सुरक्षित तरीका है: typeof (var) === 'undefined'

(*) ECMAScript 5, वैश्विक गुण undefined, NaN और Infinity के साथ केवल पढ़ने के लिए बन गया। तो सभी आधुनिक ब्राउज़रों में अपने सामान्य गोद लेने के साथ - निश्चित रूप से आईई 9 के अपवाद के साथ - उन मूल्यों को ओवरराइट करना अब संभव नहीं था।

+5

कारण 'jQuery' के बजाय jQuery इस विधि का उपयोग करता है यह है कि यह जावास्क्रिप्ट minifier में बहुत बेहतर संपीड़ित करता है। – interjay

+1

सच है, फिर भी टाइपफॉफ़ सबसे सुरक्षित तरीका है। आप अपरिभाषित की झूठी प्रकृति का भी उपयोग कर सकते हैं, जो 'अपरिभाषित' के लिए सबसे छोटी जांच होगी लेकिन अन्य झूठे मूल्यों के अस्तित्व से छायांकित है। – Christoph

16

यह सुनिश्चित करने के लिए किया जाता है कि हमेशा अनिर्धारित undefined है। ईसीएमएस्क्रिप्ट स्पेक के पुराने संस्करणों में (ईसीएमएस्क्रिप्ट 5 से पहले), अपरिभाषित एक आरक्षित शब्द नहीं बल्कि नियमित चर था। पुराने ब्राउज़र में इस उदाहरण के लिए अनुमति दी जाएगी: तो सुनिश्चित करें कि अपरिभाषित कुछ अन्य "" बुराई स्क्रिप्ट एक और मूल्य के साथ अपरिभाषित पुन: असाइन होता है, भले ही, अपरिभाषित वास्तव में बनाने के लिए

undefined = 2; // Assign a different value to undefined 

// Now this statement would be true 
if (undefined == 2) 

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

तो jQuery के मामले में:

(function($, undefined) { ... })(jQuery); 

वे jQuery में पास और सुविधा के लिए $ चर के लिए असाइन करें, लेकिन तब वे अपरिभाषित पैरामीटर के लिए एक दूसरा मान उत्तीर्ण नहीं होते हैं, इस प्रकार अपरिभाषित इच्छा अपरिभाषित होना

आधुनिक ब्राउज़रों

आधुनिक ब्राउज़रों में, undefined एक गैर विन्यास, ECMAScript 5 specification प्रति गैर-लिखने योग्य संपत्ति है।

10

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

1) यदि undefined समारोह गुंजाइश के बजाय एक वैश्विक वस्तु संपत्ति में एक चर रहा है, minifiers एक भी पत्र इस प्रकार एक बेहतर संपीड़न दर प्राप्त करने के लिए यह कम कर सकते हैं:

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