2010-10-01 17 views
50

कोशिश/पकड़ ब्लॉक के अंदर रिटर्न स्टेटमेंट कैसे काम करता है?जावास्क्रिप्ट: कोशिश/पकड़ें/आखिरकार वापसी कथन

function example() { 
    try { 
     return true; 
    } 
    finally { 
     return false; 
    } 
} 

मैं इस समारोह के आउटपुट को "सत्य" होने की उम्मीद कर रहा हूं, लेकिन इसके बजाय यह "झूठा" है!

+1

आपका प्रश्न टेक्स्ट और शीर्षक 'try'/** 'catch' ** के बारे में पूछता है, लेकिन आपका कोड' अंत में 'उपयोग करता है? – Bergi

उत्तर

53

अंत में हमेशा निष्पादित करता है। यही वह है, जिसका अर्थ है कि यह आपके मामले में वापसी का उपयोग किया जाता है।

आप तो यह इस तरह और भी है आपके कोड को बदलने के लिए चाहता हूँ:

function example() { 
    var returnState = false; // initialisation value is really up to the design 
    try { 
     returnState = true; 
    } 
    catch { 
     returnState = false; 
    } 
    finally { 
     return returnState; 
    } 
} 

सामान्यतया तुम कभी नहीं एक समारोह में एक से अधिक वापसी कथन करना चाहते हैं, इस तरह की बातें क्यों कर रहे हैं।

+20

मैं तर्क दूंगा कि एक से अधिक रिटर्न स्टेटमेंट हमेशा खराब नहीं होते हैं - http://stackoverflow.com/questions/36707/should-a-function-have देखें अधिक चर्चा के लिए केवल एक-वापसी-कथन। – Castrohenge

+3

+1 अच्छा जवाब। हालांकि एक समारोह में एक वापसी पर असहमत। –

+3

मैं भी एक वापसी नियम के बारे में असहमत हूं। आपको अंततः कभी वापस नहीं आना चाहिए, हालांकि (सी # में, इसकी अनुमति भी नहीं है)। – erikkallen

5

जब आप finally का उपयोग करते हैं, तो उस ब्लॉक के भीतर कोई भी कोड विधि से बाहर निकलने से पहले आग लग जाता है। चूंकि आप finally ब्लॉक में वापसी का उपयोग कर रहे हैं, तो यह return false पर कॉल करता है और try ब्लॉक में पिछले return true को ओवरराइड करता है।

जहाँ तक मुझे पता के रूप में आप try या नहीं अंदर एक return बयान है चाहे (शब्दावली बहुत सही नहीं हो सकता है।)

0

, finally ब्लॉक हमेशा कार्यान्वित,। Ergo, आपको अंततः ब्लॉक के अंदर return कथन द्वारा लौटाया गया मान मिलता है।

मैंने उबंटू में फ़ायरफ़ॉक्स 3.6.10 और क्रोम 6.0.472.63 के साथ इसका परीक्षण किया। यह संभव है कि यह कोड अन्य ब्राउज़रों में अलग-अलग व्यवहार कर सके।

3

आप गलत क्यों हो रहे हैं आप अंततः ब्लॉक में लौट आए हैं। अंत में ब्लॉक हमेशा निष्पादित करना चाहिए। इसलिए return false

function example() { 
    try { 
     return true; 
    } 
    catch { 
     return false; 
    } 
} 
-1

अंत में करने के लिए अपने return true परिवर्तन हमेशा एक कोशिश पकड़ ब्लॉक के अंत में चलाने के लिए इतना है कि (विनिर्देश) के द्वारा कारण है कि आप गलत लौटे हो रही है माना जाता है। ध्यान रखें कि यह पूरी तरह से संभव है कि विभिन्न ब्राउज़रों के अलग-अलग कार्यान्वयन हों।

+0

आईई 8, फ़ायरफ़ॉक्स 3.6 और क्रोम 6: सभी समान;) – bonfo

20

ECMA-262 (5ed, दिसंबर 2009), पीपी में 96 के अनुसार:।

उत्पादन इस प्रकार TryStatement : try Block Finally मूल्यांकन किया जाता है:

  1. Let बी ब्लॉक के मूल्यांकन का परिणाम हो।
  2. चलिए अंत में मूल्यांकन का परिणाम बनें।
  3. तो F.type सामान्य है, बी
  4. वापसी एफ

और पीपी से लौटने 36:।

समापन प्रकार बयान के व्यवहार की व्याख्या करने के लिए प्रयोग किया जाता है (break, continue, return और throw) जो नियंत्रण के nonlocal स्थानांतरण को निष्पादित करते हैं।समापन प्रकार के मान प्रपत्र (प्रकार, मूल्य, लक्ष्य), जहां प्रकारnormal में से एक, break, continue, return, या throw है, मूल्य की ट्रिपल किसी भी मूल्य या ECMAScript भाषा खाली है, और लक्ष्य कोई ईसीएमएस्क्रिप्ट पहचानकर्ता या खाली है।

ऐसा नहीं है कि return falseअंत मेंके रूप में वापसी है, जो कारण try ... finally करने के लिए 4. वापसी एफ के पूरा होने के प्रकार सेट होगा मौसम साफ है।

+0

यहां सबसे स्पष्ट जवाब –

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