2012-03-12 14 views
15

मैंने दूसरों को निम्नलिखित पैटर्न का उपयोग करके देखा है।जावास्क्रिप्ट फ़ंक्शन घोषणा (और अभिव्यक्ति) क्यों?

var bar = function foo(){}; 
console.log(bar); // foo() 
console.log(foo); // ReferenceError: foo is not defined 

लेकिन क्यों? यदि दोनों घोषित किए गए थे, तो मैं बिंदु देख सकता हूं, लेकिन वे नहीं हैं। कारण क्यों है?

+3

आप मिल गया है क्या एक गुमनाम समारोह एक नाम है जो नहीं है के लिए हो रही पर विचार करना चाहिए। ऐसा करने का एकमात्र कारण यह है कि जब आप foo() फ़ंक्शन में डिबगिंग कर रहे हैं तो स्टैक ट्रेस केवल 'अज्ञात फ़ंक्शन' के बजाय नाम दिखाएगा। –

उत्तर

7

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

हालांकि, नामित समारोह भाव गलत तरीके से और संशय का विषय है इंटरनेट एक्सप्लोरर < 9 में लागू कर रहे हैं और आम तौर पर जब आप उन ब्राउज़रों लक्षित कर रहे हैं बचा जाना चाहिए। अधिक जानकारी के लिए Juriy Zaytsev's excellent article on the subject देखें।

+0

+1। – fcalderan

+0

+1, जैसा मोज़िला के आधिकारिक दस्तावेज़ीकरण में देखा गया है "फ़ंक्शन का नाम केवल फ़ंक्शन के बॉडी के भीतर ही उपयोग किया जा सकता है।" Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions# मतभेद –

7

किसी एप्लिकेशन को डिबग करने पर, यह जानना आसान है कि कॉल नाम में क्या कॉल किया जा रहा है जब "नाम" अज्ञात फ़ंक्शंस का उपयोग किया जाता है। इसलिए यह डिबगिंग उद्देश्यों के लिए किसी अज्ञात फ़ंक्शन को नाम देने का एक तरीका है। वे एक गुमनाम समारोह नामकरण कर रहे हैं क्योंकि यह आसान डिबगिंग बनाता

myDiv = document.getElementById("myDiv"); 

myDiv.onclick = function OnClick(){ 
    debugger; 
    //do something 
} 
+1

मैंने एक पहेली बनाया जो आपके बिंदु को साबित करता है: http://jsfiddle.net/fqeDG/। धन्यवाद! – 98374598347934875

+4

आईई में नामित फ़ंक्शन एक्सप्रेशन का उपयोग करने से सावधान रहें <9: उन ब्राउज़रों में कार्यान्वयन टूटा हुआ है। http://kangax.github.com/nfe/ –

+0

विस्तृत करने के लिए, ऑनक्लिक विशेषता के लिए फ़ंक्शन का असाइनमेंट यानी सिंटैक्स फ़ंक्शन ऑनक्लिक() {} के पुराने संस्करणों में टूटा हुआ है। – Zoidberg

2

:

इस कोशिश करो और एक डिबगर में callstack को देखो। डिबगिंग करते समय, आपको "अज्ञात" कॉल के गुच्छा के बजाय कॉल स्टैक में "foo" पर कॉल दिखाई देगी।

2

इस कारण के लिए मैं कल्पना कर सकता हूं कि समारोह को वांछित नाम देना है। यह डिबगिंग में मदद करता है क्योंकि इंस्पेक्टर फ़ंक्शन ऑब्जेक्ट का name विशेषता का उपयोग करता है। इस प्रयास करें:

var bar = function foo(){}; 
console.log(bar.name); // foo 

यदि आप foo के अंदर कुछ वास्तविक कोड डाल दिया और अपने ब्राउज़र में JavaScript डीबगर करने के लिए एक ब्रेकपाइंट जोड़ने के लिए, आप कॉल स्टैक में foo के रूप में कार्य देखेंगे।

0

फ़ंक्शन परिभाषा (या शाब्दिक) में 4 भाग हैं। 1. आरक्षित शब्द function 2. एक वैकल्पिक नाम जिसे डिबगर्स द्वारा या फ़ंक्शन द्वारा स्वयं को पुन: कॉल करने के लिए उपयोग किया जा सकता है। 3. पैरामीटर और 4. { }

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

आप जावास्क्रिप्ट में रुचि रखते हैं क्या तुम सच में Douglas Crockford's book Javascript: The Good Parts

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