समारोह से जल्दी बाहर निकलें?


402

मेरे पास एक समारोह है:

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

क्या exit()जावास्क्रिप्ट में कुछ ऐसा है ?


4
क्या आप निष्पादन को रोकना चाहते हैं या वापस लौटना चाहते हैं?
केन स्ट्रूइस

@Ken स्ट्रूज़ क्या अंतर है? जैसा कि मैं समझता हूं, अगर मैं वापसी करता हूं, तो यह निष्पादन को रोक देता है? है ना?
शमौन

3
अच्छी तरह से यहाँ एक बात है, एक रिटर्न का उपयोग सिर्फ कॉलिंग फ़ंक्शन के संदर्भ में वापस आएगा। यदि आप वास्तव में एक्ज़िट सिमेंटिक चाहते हैं जिसे आप निष्पादन रोकना चाहते हैं, तो आप कुछ इस तरह से कर सकते हैं: vikku.info/codesnippets/javascript/…
केन

1
@Ken - वह लिंक जो आपने एक forलूप के निष्पादन को रोकने के साथ प्रदान किया है । फिर भी, मुझे पता नहीं है कि सुझाए गए तरीके का उपयोग क्यों किया जाएगा, जब आप बस कॉल कर सकते हैं break;। लेख से उदाहरण का उपयोग करने के लिए: फ़ंक्शन के if(i==5) break;उपयोग returnको रोक देगा, चाहे आप forलूप में हों या नहीं ।
user113716

Syom - हां, returnफ़ंक्शन के निष्पादन को रोक देगा, जो आपको पूछा गया लगता है।
user113716

जवाबों:


639

आप बस उपयोग कर सकते हैं return

function myfunction() {
     if(a == 'stop') 
         return;
}

यह undefinedजो भी फ़ंक्शन कहलाता है उसका रिटर्न वैल्यू भेजेगा ।

var x = myfunction();

console.log( x );  // console shows undefined

बेशक, आप एक अलग रिटर्न मान निर्दिष्ट कर सकते हैं। जो भी मूल्य वापस किया गया है वह उपरोक्त उदाहरण का उपयोग करके कंसोल में लॉग इन किया जाएगा।

return false;
return true;
return "some string";
return 12345;

4
मुझे पता है कि यह एक पुरानी पोस्ट है, और यह सामान्य अभ्यास है लेकिन मुझे लगता है कि यह एक बुरा समाधान है। यदि फ़ंक्शन मान वापस करने के लिए SUPPOSED है, तो आपको रिटर्न का उपयोग करना चाहिए। यदि आप नेत्रहीन रूप से रिटर्न का उपयोग करते हैं तो आप बाद में समस्याओं में भाग सकते हैं। खासकर यदि आप उन घटनाओं को बांधना शुरू कर देते हैं जिनमें वापसी होती है। अधिक जानकारी के लिए इस पोस्ट को देखें: fuelyourcoding.com/jquery-events-stop-misuse-return-false

64
@dbme: जावास्क्रिप्ट में फ़ंक्शंस हमेशा लौटते हैं। यदि यह प्रदान नहीं किया गया है तो रिटर्न स्टेटमेंट निहित है। डिफ़ॉल्ट रिटर्न मान है undefined, और यही मेरा प्राथमिक समाधान प्रदान करता है। आपके द्वारा संदर्भित लेख return falsejQuery इवेंट हैंडलर में करने की बात कर रहा है। यह एक पूरी तरह से अलग मुद्दा है। जावास्क्रिप्ट फ़ंक्शन से बाहर निकलने का यह उचित तरीका है। जाहिर है कि यदि कॉलर लौटाए गए मूल्य पर निर्भर करता है, तो मूल्य को उचित रूप से परिभाषित किया जाना चाहिए।
user113716

3
... एक निहित भिन्नता यह होगी if(a != 'stop') { /* run my code */ }कि कोड केवल तभी चलता है जब एक स्पष्ट प्रदान किए बिना aबराबर नहीं होता है । लेकिन रिटर्न वैल्यू मेरे समाधान के समान है । दोनों मामलों में, वापस कर दिया जाएगा। 'stop'returnundefined
user113716

3
बहुत बढ़िया प्रतिक्रिया। मुझे नहीं पता था कि एक अलग मूल्य बनाम अपरिभाषित बनाम गलत लौटने के बीच कोई अंतर था। मैं पिछले एक घंटे से इस व्यवहार के संबंध में एक निश्चित उत्तर खोजने की कोशिश कर रहा हूं। तो क्या यह कहना सुरक्षित है (अपनी बात को दोहराना) कि किसी पद्धति से बाहर निकलने के लिए रिटर्न 100% सुरक्षित तरीका है, भले ही कॉलर घटनाओं आदि के लिए बाध्य हो?

@dbme: ठीक है, यह सब इस बात पर निर्भर करता है कि फ़ंक्शन को कॉल करने की विधि क्या है। यदि कुछ कोड लाइब्रेरी एक ईवेंट सिस्टम को परिभाषित करती है जो कि undefinedरिटर्न प्राप्त होने पर (या उसे कुछ अन्य मूल्य प्राप्त नहीं होता है) तो रिटर्न वैल्यू के रूप में होता है, तो आपको उस एपीआई के विनिर्देश के अनुरूप होने की आवश्यकता होगी, और सही मूल्य वापस करना होगा। आम तौर पर एक इवेंट हैंडलिंग सिस्टम के लिए, यह undefinedएक सरल संकेत के रूप में उम्मीद करेगा कि हैंडलर समाप्त हो गया है, और आगे कोई निर्देश नहीं हैं। JQuery के साथ, return false;विशेष अर्थ देने अनुदेश एक करना है preventDefaultऔर stopPropagation
user113716

49

जाहिरा तौर पर आप यह कर सकते हैं:

function myFunction() {myFunction:{
    console.log('i get executed');
    break myFunction;
    console.log('i do not get executed');
}}

एक लेबल के उपयोग के माध्यम से ब्लॉक स्कोप देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

मैं अभी तक कोई गिरावट नहीं देख सकता। लेकिन यह एक आम उपयोग की तरह प्रतीत नहीं होता है।

इस उत्तर को प्राप्त किया: PHP PHP के मरने के बराबर


क्या इस समाधान का उपयोग नोडज निर्यात मॉड्यूल के साथ करना संभव है? जब मैं इसे आज़माता हूँ तो मुझे "लेबल का उपयोग नहीं" त्रुटि मिलती है। Export.MyFunction = फ़ंक्शन (डेटा) {myFunction: {ब्रेक myFunction;}}
यूरी अल्मेडा

20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; बस से बेहतर है return;


13
क्यों falseबेहतर है? मैं कहता हूँ कि undefinedसामान्य मामले में डिफ़ॉल्ट बेहतर है। किसी भी तरह से, आप यह कहना सही है कि सार्थक मूल्य वापस करने के लिए अक्सर बेहतर होता है।
ब्रैड कोच

यह प्रोग्रामर पर निर्भर है और उपयोग के मामले पर निर्भर है। उदाहरण के लिए, एक फ़ंक्शन कुछ को मान्य कर सकता है, इसलिए यदि सत्यापन विफल हो जाता है तो यह वापसी की falseतुलना में अधिक समझ में आता है undefined
एडम मैकआर्थर


11

थोड़ा अलग दृष्टिकोण का उपयोग करके, आप try catchफेंक स्टेटमेंट के साथ उपयोग कर सकते हैं ।

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

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

function verifyData(){
     if (document.MyForm.FormInput.value.length == "") {
          alert("Write something!");
     }
     else {
          document.MyForm.submit();
     }
}

सबमिट बटन प्रकार को "बटन" में बदलें

<input value="Save" type="button" onClick="verifyData()">

उममीद है कि इससे मदद मिलेगी।


2

A का प्रयोग returnफंक्शन को रोक देगा और रिटर्न undefined, या वैल्यू जो आप रिटर्न कमांड के साथ निर्दिष्ट करेंगे।

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}

1

मैं उन चीजों का जवाब देना पसंद करता हूं जो वास्तविक समाधान नहीं हैं ...

... लेकिन जब मुझे इस समस्या का सामना करना पड़ा, तो मैंने वर्कअराउंड से नीचे किया:

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

आशा है कि यह किसी के लिए भी उपयोगी हो सकता है।


ओह। यह इतना आसान है कि मैंने इसके बारे में कभी नहीं सोचा था !! बड़े नेस्टेड IF से बचने के लिए बहुत उपयोगी है। धन्यवाद।
डेबी ए

यह एक स्विच के साथ बेहतर होगा।
bdelmas 12

निर्भर करता है कि यदि आप एक ही बार में सभी त्रुटि अलर्ट चाहते हैं, तो केवल एक को सूचित करें। हालाँकि प्रत्येक स्थिति को वैसे भी निष्पादित करने की आवश्यकता होती है।
सिंह

0

मुझे लगता है कि एक नई त्रुटि फेंकना निष्पादन को रोकने के बजाय केवल वापसी या झूठे होने के लिए अच्छा दृष्टिकोण है। पूर्व के लिए। मैं कई फाइलों को मान्य कर रहा हूं जिन्हें मैं केवल अलग-अलग फ़ंक्शन में अधिकतम पाँच फ़ाइलों को अपलोड करने की अनुमति देता हूं।

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

लेकिन मैं इस फंक्शन को मेन फ्लो फंक्शन से कह रहा हूं

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

उपरोक्त उदाहरण में, मैं निष्पादन को रोक नहीं सकता जब तक कि मैं नई त्रुटि नहीं फेंकता। बस वापस लौटें या झूठे काम करें यदि आप निष्पादन के मुख्य कार्य में हैं अन्यथा यह काम नहीं करता है।



-4

यदि आप jquery का उपयोग कर रहे हैं। यह बबलिंग से फ़ंक्शन को रोकना चाहिए ताकि पैरेंट फ़ंक्शन यह कहकर रूक जाए।

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }

6
stopImmediatePropagation()एक jQuery की बात नहीं है, और प्रचार को रोकना एक समारोह से बाहर निकलने के समान नहीं है।
ब्रैड कोच

-13

उदाहरण के लिए, कोई भी यादृच्छिक कमांड टाइप करें जो एक त्रुटि फेंके:

exit

या

die:-)

यह सभी कोड को निष्पादित करने से रोक सकता है, न केवल बाकी फ़ंक्शन। चेक
फिडेल

1
क्या एक भयानक प्रोग्रामिंग दृष्टिकोण। यह एक और डेवलपर के लिए कैसे सहज है जो एक ही कोडबेस पर काम करता है?
ऑसूलिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.