क्या प्रत्येक जावास्क्रिप्ट फ़ंक्शन को एक मूल्य वापस करना है?


99

मैं प्रत्येक फ़ंक्शन में पेशेवर-जैसी टिप्पणियों को जोड़ने के लिए Netbeans का उपयोग कर रहा हूं, मैं लिखता हूं। इसलिए मैं इसके साथ प्रत्येक को शुरू करता हूं /**और फिर दबाता हूंEnter निम्नलिखित फ़ंक्शन के लिए नेटबीन्स को डिफ़ॉल्ट टिप्पणी योजना को पूरा करने के लिए ।

अब तक मैं इसे केवल PHP भाषा के लिए उपयोग कर रहा हूं और इस मामले में Netbeans हमेशा @returns {type}केवल टिप्पणी योजना में भाग ले रहा था , अगर निम्नलिखित PHP फ़ंक्शन में वास्तव में returnबयान शामिल था । तथाकथित "प्रक्रियाओं" (ऐसे कार्य जो किसी भी मूल्य को वापस नहीं करते हैं) पर यह हिस्सा गायब था।

आज मैंने जावास्क्रिप्ट फ़ंक्शन के लिए एक ही चीज़ की कोशिश की और नेटबीन्स ने @returns {undefined}टिप्पणी योजना में भाग जोड़ा, भले ही निम्नलिखित फ़ंक्शन कुछ भी वापस नहीं करता है।

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


6
यदि कोई वापसी मान निर्दिष्ट नहीं है, तो जावास्क्रिप्ट वापस आएगा undefined। कई भाषाओं में अंतिम विवरण का परिणाम लौटाया जाता है (अधिक उपयोगी, IMO)। इन्हें निहित प्रतिफल कहा जाता है
ज़ाज़

जवाबों:


189

संक्षिप्त जवाब नहीं है।

असली जवाब है हां: जे एस इंजन सूचित कर दिया है कि कुछ समारोह अपना कारोबार है, जो कुछ लौटने समारोह द्वारा किया जाता है समाप्त हो गया है है। यह भी क्यों, "समाप्त" के बजाय , एक फ़ंक्शन को "वापस आ गया " कहा जाता है ।
एक फ़ंक्शन जिसमें स्पष्ट रिटर्न स्टेटमेंट का अभाव है undefined, एक C (++) फ़ंक्शन की तरह लौटेगा , जिसका कोई रिटर्न वैल्यू नहीं है (और इसका हस्ताक्षर इसे दर्शाता है) वापस आने के लिए void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

इसके अलावा, जेएस में, हर भाषा की तरह, आप केवल एक फ़ंक्शन के रिटर्न मान को अनदेखा करने के लिए स्वतंत्र हैं, जो एक बहुत कुछ किया जाता है:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

कुछ बहुत निचले स्तर पर, रिटर्न का अनुवाद किसी प्रकार की छलांग में किया जाता है। यदि कोई फ़ंक्शन वास्तव में कुछ भी नहीं लौटाता है , तो यह जानने का कोई तरीका नहीं होगा कि अगले फ़ंक्शन को क्या और कब कॉल करना है, या इवेंट हैंडलर और इस तरह कॉल करना है।

इसलिए फिर से तैयार करने के लिए: नहीं, जेएस फ़ंक्शन को आपके कोड के जाने तक कुछ भी वापस करने की आवश्यकता नहीं है। लेकिन जहाँ तक JS इंजनों की बात है: एक फंक्शन हमेशा कुछ देता है, यह स्पष्ट रूप से एक returnस्टेटमेंट के माध्यम से , या निहित रूप से हो। यदि कोई फ़ंक्शन अंतर्निहित रूप से वापस आता है, तो इसका रिटर्न मान हमेशा अपरिभाषित रहेगा।


5
मुझे विश्वास नहीं है कि C ++ (या C) "एक शून्य लौटाता है"। "शून्य" टैग इंगित करता है कि यह कुछ भी वापस नहीं करता है। हालांकि यह एक मामूली बात है और पूछे गए सवाल से इसका कोई लेना-देना नहीं है।
जय

2
यह वास्तव में वापस नहीं voidआता है, यह कुछ भी नहीं लौटाता है, लेकिन इसका हस्ताक्षर voidरिटर्न प्रकार के माध्यम से इसे दर्शाता है ।
एलियास वान ओटगेम

क्या स्पष्ट वापसी बनाम निहितार्थ के लिए कोई प्रदर्शन लाभ हैं?
मीटर 1

@ 4m1r: मुझे नहीं पता, यह शायद इंजन पर निर्भर करता है। यदि प्रदर्शन में अंतर है, तो यह नगण्य होने की सबसे अधिक संभावना है। return;यदि आपको जल्दी लौटने की आवश्यकता है तो निहित रिटर्न बनाम केवल उपयोगी है। return undefined;यदि undefinedकोई भिन्न मान निर्धारित करता है, तो लेखन अलग परिणाम उत्पन्न कर सकता है । अधिकांश (यदि सभी नहीं हैं) ब्राउज़र्स एक त्रुटि को फेंक देंगे जब आप अपरिभाषित को पुन: असाइन करने का प्रयास करते हैं, लेकिन सिद्धांत रूप में, यह संभव है यहां नोड.जेएस का उपयोग करते हुए एक उदाहरण है
एलियास वान ओओटगेम

1
@SebastianLasse: मैं voidअन्य भाषाओं (जैसे C) का उल्लेख कर रहा था , जहाँ आपके पास फ़ंक्शन हो सकते हैं void do_someting(int *arg), लेकिन आपके पास प्रकार के साथ कोई चर नहीं हो सकता void। सी में, voidवास्तव में एक प्रकार नहीं है, इसलिए ये फ़ंक्शन कुछ भी वापस नहीं करते हैं , वे बस कूदते हैं
एलियास वान ओओटगेम

26

नहीं, रिटर्न जरूरी नहीं है।

लेकिन वास्तव में कोई वापसी नहींundefined


6

क्या प्रत्येक जावास्क्रिप्ट फ़ंक्शन को एक मूल्य वापस करना है?

नहीं, वे नहीं। यह सच है कि विनिर्देशन में गहरी, ये सभी थोड़ा अलग हैं:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... लेकिन का परिणाम है उनमें से प्रत्येक को कॉल समान है undefined:। अत: व्यावहारिक दृष्टि से:

  1. आपको एक लिखने की ज़रूरत नहीं है return, आप केवल फ़ंक्शन के कोड को "फ़ंक्शन के अंत में गिर सकते हैं"
  2. यदि आप वापस लौट रहे हैं undefined, विशेष रूप से, तो आप सिर्फ लिखते हैंreturn;
  3. किसी फ़ंक्शन को कॉल करते समय, आप यह नहीं बता सकते (कोड में) कि क्या निष्पादन समाप्त हो गया, समाप्त हो गया return; , या उसके साथ समाप्त हो गया return undefined;; वे सभी आपके कॉलिंग कोड के समान ही दिखते हैं

कल्पना फिर से करें: विशेष रूप से, जब एक फ़ंक्शन का निष्पादन अंत में गिर जाता है, तो कल्पना में कि "सामान्य" पूरा हो रहा है; लेकिन return;और return value;दोनों एक संबंधित मूल्य ( undefined) के साथ "वापसी" पूर्णताएं हैं , जो कि (कभी-कभी थोड़ा) अलग है। लेकिन अंतर को शब्दार्थ द्वारा समाप्त कर दिया जाता है किसी फ़ंक्शन कॉल , जो कहता है:

...

  1. यदि परिणाम है । [[प्रकार]] है return, सामान्यकंप्लीमेंट लौटाएँ ( परिणाम । [[मान]])।
  2. ReturnIfAbrupt ( परिणाम )।
  3. सामान्य वापसी ( अपरिभाषित ) लौटें ।

इसलिए कोड में कोई अंतर नहीं है।


2

नहीं, आपको प्रत्येक फ़ंक्शन के लिए कुछ वापस नहीं करना है। यह वैकल्पिक है और आप अपने कोड तर्क को कैसे लिखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.