2013-06-24 4 views
5

किसी एक कार्य को परिभाषित कैसे कर सकता है जो जावास्क्रिप्ट में एक दूसरे को कॉल करता है ताकि जेएस-लिंट शिकायत न करे कि 'फैक्टोरियल' का उपयोग इसे परिभाषित करने से पहले किया जा रहा है?जावास्क्रिप्ट फ़ंक्शंस के बीच परिपत्र संदर्भ

function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

ऐसा लगता है कि कोई मान्य आदेश नहीं है जो जेएसलिंट को संतुष्ट करेगा। (एक दूसरे में एम्बेड किया जा सकता है, लेकिन यह उन कार्यों के संग्रह के लिए एक दुःस्वप्न होगा जो सभी एक-दूसरे को कॉल करते हैं)।

निश्चित रूप से यह भाषा सही ढंग से संभाला जाता है? क्या यह जेएसलिंट में बस एक बग है? (इस प्रश्न का उत्तर कहीं दिया जाना चाहिए, लेकिन मुझे यह नहीं मिल रहा है!)

+0

शायद आपके पास 'n === 0 था? 1: ... '। साथ ही, क्या काम नहीं करता है (तार्किक त्रुटि को छोड़कर मैंने पहले ही बताया है)? – Dogbert

+0

>> निश्चित रूप से यह भाषा द्वारा सही तरीके से संभाला जाता है? आम तौर पर आपका पृष्ठ अप्रतिबंधित हो जाता है और ब्राउज़र आपको पॉपअप अलर्ट फेंकता है जो आपको स्क्रिप्ट को रोकने या इसे जारी रखने के लिए कहता है। – mohkhan

+0

@ डॉबर्ट हां, आपका संपादन सही है। लेकिन असली मुद्दा यह है कि जेएसलिंट शिकायत करता है कि परिभाषित होने से पहले 'फैक्टोरियल' संदर्भ दिया जा रहा है। –

उत्तर

6

कार्यों के अंदर संदर्भ निष्पादित किए जाने तक हल नहीं किए जाते हैं। जब तक दोनों कार्य निष्पादित किए जाते हैं, तब तक दोनों कार्यों को परिभाषित किया जाता है, वे एक-दूसरे को मिलेंगे।

आप JSLint चेतावनी से छुटकारा पाने के लिए चाहते हैं, तो आप, फ़ंक्शन का नाम निर्धारित कर सकते हैं बस से पहले:

var factorial; 
function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 
+0

के भीतर कई अन्य लोगों को बुलाया है क्षमा करें, मैंने यह स्पष्ट नहीं किया कि मुद्दा यह है कि जेएस-लिंट शिकायत कर रहा है। –

+0

धन्यवाद! बेशक। मैंने नामित कार्यों के साथ एक var समारोह में मिश्रण पर विचार नहीं किया! –

0

मैं कार्यों के लिए इस वाक्य रचना पसंद करते हैं:

var factorial1 = function(n) { return factorial(n); } 
var factorial = function(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

नहीं होगा इस वाक्यविन्यास के साथ "घोषणा" समारोह को भूलने में सक्षम हो।

+0

सभी कथन अर्धविराम से समाप्त किया जाना चाहिए। यहां कोई बड़ा सौदा नहीं है, लेकिन अगर आप इन बयानों को प्रतिलिपि बनाते हैं तो इससे समस्याएं पैदा हो सकती हैं। –

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