2010-09-15 16 views
31

मैं एक बड़े जावास्क्रिप्ट दस्तावेज़ को दोबारा कर रहा हूं जिसे मैंने ओपन सोर्स प्रोजेक्ट से उठाया था। कई फ़ंक्शन असंगत रिटर्न स्टेटमेंट का उपयोग करते हैं। मेरा मतलब यह है कि मेरा क्या मतलब है:क्या रिटर्न स्टेटमेंट का उपयोग करने का कोई फायदा है जो कुछ भी नहीं देता है?

var func = function(param) { 
    if (!param) { 
     return; 
    } 
    // do stuff 
    return true; 
} 

कभी-कभी फ़ंक्शन बूलियन, कभी-कभी स्ट्रिंग या अन्य चीजें लौटाते हैं। आम तौर पर वे एक सशर्त के अंदर एक सरल return; कथन के साथ असंगत रूप से जोड़े जाते हैं।

समस्या यह है कि कोड जटिल है। यह एक पार्सर है जो अद्वितीय रेगेक्स मैचों की एक बड़ी संख्या का उपयोग करता है, फ्लाई पर डीओएम नोड्स बनाता है और नष्ट करता है। प्रारंभिक परीक्षण से पता चलता है कि, उपर्युक्त उदाहरण में, मैं return; कथन return false; बनने के लिए बदल सकता हूं, लेकिन मुझे चिंता है कि मुझे एहसास नहीं हो सकता है कि स्क्रिप्ट पर इसका नकारात्मक प्रभाव पड़ा (यानी कुछ फीचर काम करना बंद कर दिया)।

तो मेरे प्रश्न: क्या रिक्त रिटर्न स्टेटमेंट का उपयोग करने का कोई लाभ है? क्या यह जानबूझकर इस तरह से कोड किया गया था या यह सिर्फ आलसी था? क्या मैं उन्हें return false;, या return null; पर बदल सकता हूं या क्या मुझे हर कॉल के माध्यम से खोदने की आवश्यकता है और यह पता लगाना है कि वे उन कार्यों के परिणामों के साथ क्या कर रहे हैं?

+0

मुझे लगता है कि मैं रखरखाव चक्र के दौरान कम सोचने के लिए रोकता हूं अगर मैं सच या झूठी तार्किकता की खोज करता हूं, लेकिन अन्य नोट्स कंबल परिवर्तन से पहले कार्यात्मक उपयोग सुनिश्चित करते हैं। –

उत्तर

35

मूल्य के बिना return का उपयोग कर undefined मान वापस करेगा।

मूल्य एक बूलियन के रूप में मूल्यांकन किया जाता है, undefinedfalse के रूप में काम करेंगे, लेकिन अगर उदाहरण के लिए मूल्य false की तुलना में है, तो आप एक अलग व्यवहार मिल जाएगा:,

var x; // x is undefined 
alert(x); // shows "undefined" 
alert(!x); // shows "true" 
alert(x==false); // shows "false" 

इसलिए जब कोड होना चाहिए तार्किक रूप से true या false, true या undefined पर वापस लौटें, आप केवल return; से return false; को बदले बिना वापसी मूल्य का उपयोग किए बिना बदल सकते हैं।

+0

मैंने अपरिभाषित पर विचार नहीं किया। चूंकि आप इसका उल्लेख करने वाले पहले व्यक्ति हैं, और आपका उत्तर दूसरों के समान है, मैं इसे सही के रूप में चिह्नित कर रहा हूं। – Stephen

+0

@Stephen कृपया ध्यान दें कि इसका मतलब यह नहीं है कि आप इसे 'अपरिभाषित वापसी' में बदल सकते हैं, क्योंकि इसका मतलब वैश्विक वैरिएबल को अनिर्धारित कर देगा, जो कि हाल ही के ब्राउज़र तक कुछ भी हो सकता है। – Paulpro

+0

@ user1: मुझे पता है कि 'अपरिभाषित' "स्थिर" वास्तव में स्थिरांक नहीं है (मैंने इसके बारे में भी ब्लॉग किया है), लेकिन मुझे पता नहीं था कि यह बदलेगा? क्या एक्मास्क्रिप्ट विनिर्देश बदल गया है? – Guffa

14

"खाली वापसी" कथन का उपयोग कॉलिंग फ़ंक्शन पर नियंत्रण को स्थानांतरित करने के लिए किया जा सकता है (या किसी कारण से किसी फ़ंक्शन को निष्पादित करना बंद करें - पूर्व: सत्यापन आदि)। ज्यादातर मामलों में मैं रिक्त रिटर्न स्टेटमेंट का उपयोग करता हूं जब मैं किसी प्रकार का सत्यापन कर रहा हूं। हालांकि, मैं इसे कुछ संकेतक सेट करने का एक बिंदु बना देता हूं कि फ़ंक्शन का निष्पादन क्यों बंद हो गया है। उदाहरण के लिए, त्रुटि संदेश के साथ एक DIV तत्व पर "innerText" प्रॉपर्टी सेट करें।

उपरोक्त कोड में, ऐसा लगता है कि यह एक सत्यापन है। यदि सब कुछ ठीक हो गया तो फ़ंक्शन एक "सत्य" देता है। ऐसा लगता है कि कॉलिंग फ़ंक्शन रिटर्न वैल्यू को पार करता है, और यदि यह "सत्य" है, तो कथन का अगला चरण (कॉलिंग फ़ंक्शन में) निष्पादित किया जाता है।

उपर्युक्त उदाहरण में रिक्त वापसी के बजाय "झूठी" लौटने का एक अच्छा अभ्यास है। इस तरह आप इसे सभी वर्दी बनाते हैं और अन्य प्रोग्रामर के लिए जीवन आसान बनाते हैं।

आप इस तरह की असंगतताओं को ठीक कर सकते हैं; हालांकि, सुनिश्चित करें कि आप सभी परिवर्तनों का पूरी तरह से परीक्षण करें। कोड में किए गए प्रत्येक परिवर्तन का परीक्षण करना एक अच्छा अभ्यास है, हालांकि यह छोटा हो सकता है।

5

अपने कार्यों को बदलने से वास्तव में कोड बदल जाएगा क्योंकि return; और return false; आउटपुट विभिन्न डेटा प्रकारों को आउटपुट करता है।

var test = function (x) { 
    if (!x) { 
     return; 
    } 
    else { 
     return false; 
    } 
}; 

var a = test(true), b = test(false); 

console.log(typeof b); // boolean 
console.log(typeof a); // undefined 
+0

बहुत अच्छा। धन्यवाद! स्पष्टीकरण के लिए – Stephen

8

यहाँ क्या खो दिया हो सकता है (अपने उदाहरण के साथ सीधे नहीं) है कि आप तो एक त्रिकोणीय राज्य वस्तु हो सकता है:

var myfunc = function(testparam) { 
    if (typeof testparam === 'undefined') return; 
    if (testparam) { 
     return true; 
    } 
    else { 
     return false; 
    } 
}; 

var thefirst = myfunc(true) 
var thesecond = myfunc(false); 
var thelast = myfunc(); 
alert("type:" + typeof thefirst+" value:"+thefirst); 
alert("type:" + typeof thesecond+" value:"+thesecond); 
alert("type:" + typeof thelast+" value:"+thelast); 

इन वापसी:

> type:boolean:true 
> type:boolean:false 
> type:undefined:undefined 

ध्यान दें: इस उदाहरण में माफ झूठ वापस आ जाएगा myfunc (शून्य);

+0

धन्यवाद। – Stephen

+0

यह उत्तर 6 साल का है और किसी ने भी निम्नलिखित अवलोकन नहीं किया है, इसलिए शायद मैं "नोट" के इच्छित स्पष्टीकरण को सही ढंग से समझ नहीं पा रहा हूं। ऐसा कहकर, Myfunc (शून्य) झूठी वापसी होगी, अपरिभाषित नहीं। – bryonbean

+0

@ ब्रायनबीन शीर्ष पर यह पंक्ति: 'अगर (टाइपफ टेस्टपरैम ===' अपरिभाषित ') वापसी;' इसे 'if (testparam === अपरिभाषित) रिटर्न से संपादित किया गया था, हालांकि सिद्धांत अभी भी सच है –

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

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