2012-06-23 18 views
16

jQuery के असंपीड़ित स्रोत कोड को देखते हुए मैंने कुछ ऐसी चीज पर ठोकर खाई जिसे मैं समझ में नहीं आता। जब उनका अनाम कार्य बनाते हैं, तो वे दूसरे तर्क के रूप में अपरिभाषित होते हैं। यह क्या कर रहा है, और वे अनिर्धारित क्यों उपयोग कर रहे हैं? क्या किसी अज्ञात फ़ंक्शन में एक तर्क के रूप में अपरिभाषित रखना आवश्यक है? नीचे एक उदाहरण है जिसके बारे में मैं बात कर रहा हूं।जावास्क्रिप्ट फ़ंक्शन में "अपरिभाषित" नामक पैरामीटर का उद्देश्य क्या है?

(function(window, undefined) { 
    ...code here 
})(window); 
+1

संबंधित: http://stackoverflow.com/q/5020479/ – CMS

+0

संबंधित: [पुराने ब्राउज़र में window.undefined mutable क्यों है?] (Https://stackoverflow.com/q/29742135/1048572) – Bergi

उत्तर

17

,:

जब undefined वास्तव में अपरिभाषित नहीं है, उदाहरण के लिए इस कोड को ले लो। एक असफलता है।अन्य कोड गलती से

undefined = something; 
console.log(undefined); // will output 'something' 

की तरह कुछ करना और जावास्क्रिप्ट में मान्य thats सकता है क्योंकि (जे एस इंजन इस्तेमाल किया जा रहा है, तो लागू नहीं किया ECMAScript 5 विनिर्देश, ECMAScript में 5 कल्पना undefined गैर non-writable, MDN DOC है),

MDN New_in_JavaScript 1.8.5 (ECMA 5) पृष्ठ

से उद्धरण

परिवर्तन वैश्विक वस्तुओं के लिए

वैश्विक वस्तुओं केवल

NaN, इन्फिनिटी, और अपरिभाषित वैश्विक वस्तुओं किए गए हैं केवल पढ़ा है, प्रति ECMAScript 5 विनिर्देश पढ़ बना दिया।

और ES5 Annotated Spec से Guthub

में

ES5 spec Sectionx15.1.1.3

15.1.1.3 अपरिभाषित

अपरिभाषित का मूल्य अपरिभाषित है (8.1 देखें)।

इस संपत्ति में विशेषताएँ {[[लिखने योग्य]]: झूठी, [[गणना]]: झूठी, [[कॉन्फ़िगर करने योग्य]]: झूठी}।

यहां तक ​​कि अगर global undefined को लिखने योग्य आप एक स्थानीय चर undefined नामित करने और अपने कोड गड़बड़ कर सकते हैं (मुख्य रूप से undefined के साथ तुलना) हो सकता है नहीं है। लेकिन यह आपकी ज़िम्मेदारी है। आप की तरह

(function(){ 
    console.log('Second Case: '); 
    var undefined = 'Something'; 
    console.log(undefined); // Will log `something` 
    var a ; // a is undefined 
    console.log(a === undefined); // false, as undefined is changed 
    // you might expect a === undefined will return true, but as 
    // `undefined` is changed it will return false. 
    console.log(a); // undefined 
})(); 

डेमो कोड हो सकता है:http://jsfiddle.net/joycse06/V4DKN/

हालांकि undefined अगर लिखने योग्य है तो ऊपर काम में बाधा हो सकती है कई comparisonundefined के रूप में कोड की है कि रेखा के बाद undefined के साथ बनाया undefined अब और नहीं है। अब कुछ मूल्य है।

तो के रूप में वे की तरह

(window) // one argument only 

कि अज्ञात फ़ंक्शन कॉल और प्राप्त

(window, undefined) // only window is passed when calling the function 
      // Second argument is not passed means it's undefined 
      // so undefined is restored to undefined inside that function 
      // and no global accidental assignments can hamper jQuery's 
      // code using 'undefined' now 

कि बंद undefined अंदर इसका मतलब है कि undefined को पुनर्स्थापित किया जाता है, के रूप में यह इस प्रकार हासिल करने के लिए किसी भी मान प्रदान किया नहीं किया गया है कर रहे हैं उस अज्ञात फ़ंक्शन के अंदर undefined का उपयोग करें।

इस http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/

पर एक बहुत अच्छा विस्तृत लेख मैं चीजों को स्पष्ट

क्या अपरिभाषित है बनाने के लिए उपरोक्त लेख लिंक से कुछ लाइनों के हवाले कर रहा हूँ?

जावास्क्रिप्ट में अनिर्धारित (प्रकार), अपरिभाषित (मान) और अपरिभाषित (चर) है।

अपरिभाषित (प्रकार) एक अंतर्निहित जावास्क्रिप्ट प्रकार है।

अपरिभाषित (मूल्य) एक आदिम है और यह अनिर्धारित प्रकार का एकमात्र मूल्य है।

कोई भी संपत्ति जिसे मूल्य निर्दिष्ट नहीं किया गया है, अपरिभाषित मान मानता है। (ईसीएमए 4.3.9 और 4.3.10)।

रिटर्न स्टेटमेंट के बिना कोई फ़ंक्शन, या खाली रिटर्न स्टेटमेंट वाला फ़ंक्शन अपरिभाषित हो जाता है। एक अनुपयुक्त फ़ंक्शन तर्क का मान अपरिभाषित है।

var a; 
typeof a; //"undefined" 

window.b; 

typeof window.b; //"undefined" 



var c = (function() {})(); 

typeof c; //"undefined" 



var d = (function(e) {return e})(); 

typeof d; //"undefined" 

अपरिभाषित (चर) एक वैश्विक संपत्ति जिसका प्रारंभिक मूल्य अपरिभाषित है (मान), के बाद से अपने एक वैश्विक संपत्ति हम भी एक चर के रूप में भी पहुंच सकते हैं। स्थिरता के लिए मैं हमेशा इस आलेख में एक चर को कॉल करने जा रहा हूं।

typeof undefined; //"undefined" 
var f = 2; 
f = undefined; //re-assigning to undefined (variable) 
typeof f; //"undefined" 

ECMA 3 के रूप में, अपने मूल्य पर पुन: सौंपा जा सकता है:

undefined = "washing machine"; //assign a string to undefined (variable) 
typeof undefined //"string" 
f = undefined; 
typeof f; //"string" 
f; //"washing machine" 

अनावश्यक कहने के लिए फिर से बताए अपरिभाषित चर के लिए मान बहुत बुरा व्यवहार है, और वास्तव में अपने ECMA द्वारा अनुमति नहीं 5.

+1

console.log (अपरिभाषित) .. या नहीं? हाँ, जैसे :) – Luceos

+1

@ लुइसोस, टाइपो को इंगित करने के लिए धन्यवाद सर। :) –

+0

तो, उदाहरण के लिए यदि मेरे पास अज्ञात फ़ंक्शन के बाहर "var undefined = 1" था, और मेरे पास एक अनाम कार्य था जो इस तरह दिखता था: (फ़ंक्शन (विंडो, अपरिभाषित) {}) (विंडो); ... हैं आप कह रहे हैं कि अपरिभाषित = 1 में अब अपरिभाषित मूल्य है? – JaPerk14

3

अपरिभाषित एक प्रकार है लेकिन यह एक वैश्विक चर भी है।

आपके पास एक मॉड्यूल हो सकता है जो undefined = whatever करके अपरिभाषित मूल्य को ओवरराइट करता है।

(function(window, undefined) { 
    // undefined is the undefined parameter 
}(window)); 

यह सुरक्षित है, के रूप में undefined पैरामीटर स्थानीय दायरे में है, और इस समारोह में कोड को छोड़कर कोई भी प्रदान कर सकते हैं:

में undefined वास्तव में पूरी कोड लपेटकर एक समारोह का एक अपरिभाषित पैरामीटर है इसके लिए

अज्ञात फ़ंक्शन को परिभाषित करते समय undefined पैरामीटर के रूप में उपयोग करना आवश्यक नहीं है।

क्या आप समारोह ऊपर दिखाई देता है तो नोटिस डब्ल्यूएलएल यह उम्मीद है कि दो पैरामीटर लेकिन एक आपूर्ति की है।

क्यों undefined को पुनर्स्थापित करने की आवश्यकता है?

, क्योंकि लगता है कि वास्तव में undefined घुंघराले ब्रेसिज़ के बीच दायरे में undefined है, भले ही कोई वैश्विक क्षेत्र में undefined = "defined"; की तरह कुछ लिखा है, क्योंकि undefined वास्तव में नए सिरे से परिभाषित किया जा सकता है बनाता है।

तो तुम को यकीन है कि undefined वास्तव में उस पैरामीटर के लिए एक तर्क गुजर नहीं द्वारा अपने दायरे के भीतर अपरिभाषित है बना रही है

var undefined = 1; 

(function(window, undefined) { 
    console.log(undefined); // output will be undefined not 1 
}(window)); 
+0

आप यह नहीं समझाते कि क्यों अनिर्धारित जरूरतों को बहाल किया जाना चाहिए, अन्य उत्तरों करते हैं। – Luceos

2

jQuery की तरह कुछ है। यह क्या कर रही है कि बंद के अंदर undefined करने के लिए undefined फिर नियत है

var undefined = 1; 
alert(undefined); // 1 
संबंधित मुद्दे