javascript 'आखिरकार' में वापसी क्यों 'कोशिश' ओवरराइड करती है?




return try-catch (6)

आप झूठी क्यों हो रही हैं आप अंततः ब्लॉक में लौट आए हैं। अंत में ब्लॉक हमेशा निष्पादित करना चाहिए। तो return false लिए आपकी return true परिवर्तन

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

कोशिश / पकड़ ब्लॉक के अंदर रिटर्न स्टेटमेंट कैसे काम करता है?

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

मैं इस समारोह के आउटपुट को true होने की उम्मीद कर रहा हूं, लेकिन इसके बदले यह false !


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


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

आप अपना कोड बदलना चाहते हैं, इसलिए यह इस तरह है:

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

आम तौर पर आप कभी भी एक समारोह में एक से अधिक रिटर्न स्टेटमेंट नहीं चाहते हैं, इस तरह की चीजें हैं।


ईसीएमए -262 (5, दिसंबर 200 9) के अनुसार, पीपी 96 में:

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

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

और पीपी 36:

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

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


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

(शब्दावली शायद सही नहीं हो सकती है।)


जहां तक ​​मुझे पता है, finally अवरोध हमेशा निष्पादित होता है, भले ही आपके पास try अंदर return विवरण है या नहीं। Ergo, आप अंत में ब्लॉक के अंदर return स्टेटमेंट द्वारा वापस मूल्य मिलता है।

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





try-finally