2014-09-17 9 views
23

मेरे पास मेरे HTML पृष्ठ में नीचे एक जावास्क्रिप्ट कोड ब्लॉक है। जब मैं पेज लोड करके इसे चलाता हूं। मुझे अपने ब्राउज़र कंसोल पर आउटपुट नीचे मिल रहा है।"अनकॉटेड टाइप एरर: अपरिभाषित कोई फ़ंक्शन नहीं है" जावास्क्रिप्ट कोड ब्लॉक

outer world 
Uncaught TypeError: undefined is not a function 

आपको कोड स्निपेट में देख सकते हैं, मैं समारोह कोड में कहीं भी b नामित क्रियान्वित नहीं कर रहा हूँ। लेकिन कोड चलाने पर, उस फ़ंक्शन का आउटपुट undefined is not a function error के साथ आ रहा है जिसे मैं अपने कोड ब्लॉक में कहीं भी नहीं ढूंढ सका।

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

क्या आप कृपया मुझे यह समझने में मदद कर सकते हैं कि ऐसा क्यों हो रहा है?

var b = function() { 
 
    console.log('outer world'); 
 
} 
 

 
(function() { 
 

 
})();

उत्तर

32

b घोषित करने के बाद एक ; छूटी। निम्नलिखित कोड बराबर है आपके पास क्या है।

var b = function() { 
    console.log ('outer world'); 
}(function() {})(); 

; बी के बिना स्वयं निष्पादन और एक पैरामीटर के रूप में एक खाली कार्य लेता है। उसके बाद यह फिर से निष्पादित करता है; हालांकि, क्योंकि बी एक फ़ंक्शन नहीं लौटाता है, इसलिए आपको अपवाद मिलता है।

मेरा सुझाव है कि आप ; छोड़ें जब तक कि आप जेएस निंजा बनें :)। वैश्विक स्कोप प्रदूषण से बचने के लिए b रखें।

(function() { 
    "use strict"; 

    var b = function() { 
     console.log("hi"); 
    }; 
    // other code 
}()); 

Semicolon auto-insertion discussion

मामले में आप अर्धविराम नहीं करना चाहते, पहले स्वयं चल समारोह

var b = function() { console.log('outer world') } 
;(function() { /* ... */ }()) 
+6

अंत में, एक उदाहरण जहां जावास्क्रिप्ट स्वचालित रूप से अर्धविराम नहीं डालता है, जहां इसे जोड़ने के लिए सहज लगता है! – Barmar

+5

कुछ भी जो '(' या '[' जरूरतों ';' से पहले शुरू होता है। – kornieff

+0

हां। इससे मुझे परिदृश्य को समझने में मदद मिलती है। क्या आप रिकर्ड स्टाफ के उत्तर में प्रदान किए गए लिंक को शामिल करेंगे। इससे मुझे और समझने में मदद मिली। – mithunsatheesh

5

आप अपने वर घोषणा के बाद अर्धविराम की जरूरत है, और वैसे, लॉग के बीच की जगह को हटा दें और (

var b = function() { 
     console.log('outer world'); 
}; 
+0

आप एक विवरण प्रदान कर सकते हैं एक ऑपरेटर जोड़ने जब हम अर्द्ध बृहदान्त्र छोड़ कैसे यह इस तरह देता है एक आउटपुट पृष्ठभूमि में क्या हुआ कि मेरे पास मेरे कोड में नहीं है? मैं किसी भी बिंदु – mithunsatheesh

+0

पर बी निष्पादित करने के लिए @ kornieff का जवाब पढ़ें। और http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi – Barmar

+0

यह आपके परिभाषित फ़ंक्शन को निष्पादित करने का प्रयास करेगा जो console.log को आउटपुट करता है, और भेजता है यह एक नए अज्ञात फ़ंक्शन का पैरामीटर है, फिर अंत में आप उस फ़ंक्शन को निष्पादित करने का प्रयास कर रहे हैं जो मौजूद नहीं है, क्योंकि उस बिंदु पर आपके पास अब कोई फ़ंक्शन नहीं है। –

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