क्या रिटर्न एक लूप बंद करता है?


157

मान लीजिए कि मेरे पास एक लूप है जैसे:

for (var i = 0; i < SomeArrayOfObject.length; i++) {

  if (SomeArray[i].SomeValue === SomeCondition) {

     var SomeVar = SomeArray[i].SomeProperty;
     return SomeVar;
  }
}

त्वरित प्रश्न: क्या returnअपने आप में लूप का निष्पादन रोक देता है?

जवाबों:


206

हां, returnनिष्पादन को रोकता है और फ़ंक्शन को बाहर निकालता है। returnहमेशा ** अपने कार्य को तुरंत समाप्त कर देता है, आगे के निष्पादन के साथ अगर यह एक लूप के अंदर है।

यह आसानी से अपने लिए सत्यापित है:

function returnMe() {
  for (var i=0; i<2; i++) {
    if (i === 1) return i;
  }
}

alert(returnMe());
// 1

** नोट्स: इस विशेष मामले के बारे में try/catch/finally और इस जवाब के बारे में अन्य जवाब देखें कि कैसे लूप के अपने फंक्शन का दायरा होता है, जिसमें फंक्शन शामिल नहीं होगा।


25
> रिटर्न हमेशा अपने फंक्शन को तुरंत बाहर निकालता है, आगे के निष्पादन के साथ अगर यह एक लूप के अंदर है ... जब तक कि यह एक लूप नहीं है
oo

9
@oo सच की तरह। returnअभी भी फ़ंक्शन कॉलबैक की वर्तमान पुनरावृत्ति से, अपने स्वयं के दायरे में, लेकिन संपूर्ण कॉलिंग विधि से टूटने की उम्मीद नहीं की जाएगी forEach()। इसलिए यह स्वयं लूप से नहीं लौट रहा है , लेकिन यह कॉलबैक से लौट रहा है जो लूप निष्पादित करता है। जुड़ा हुआ सवाल से कोड उदाहरण में, उत्पादन है 1,2,4,5लंघन 3वापसी की वजह से।
माइकल बेर्कोव्स्की

शायद लाल धागा वह है जो returnहमेशा वर्तमान thisसंदर्भ से वापस आ जाएगा ।
oo

"संभावित" प्रारंभिक लूप समाप्ति के लिए किसी सरणी पर forEach () या के लिए () का उपयोग करने का विकल्प कुछ () का उपयोग कर रहा है।
अनीसब

1
मुझे पता है कि यह कुछ लोगों के लिए तुच्छ है, लेकिन यह इतना अच्छा है क्योंकि आपको अब breakऔर नहीं करना है return
NoName

60

में सबसे (इसे मिलाकर) मामलों, returnतुरंत बाहर निकल जाएगा। हालांकि, यदि रिटर्न tryएक साथ finallyब्लॉक के साथ एक ब्लॉक में है, तो finallyहमेशा निष्पादित होता है और में "ओवरराइड" कर सकता returnहै try

function foo() {
    try {
        for (var i = 0; i < 10; i++) {
            if (i % 3 == 0) {
                return i; // This executes once
            }
        }
    } finally {
        return 42; // But this still executes
    }
}

console.log(foo()); // Prints 42

8

returnबयान एक पाश केवल अगर यह समारोह अंदर बंद हो जाता है। अन्यथा, आपको यह त्रुटि मिलेगी:

Uncaught SyntaxError: Illegal return statement(…)

6

यह कोड लूप में पहली पुनरावृत्ति के बाद लूप से बाहर for ofनिकलेगा:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];
for (const iterator of objc) {
  if (iterator.name == 2) {
    return;
  }
  console.log(iterator.name);// 1
}

नीचे दिए गए कोड हालत पर कूद जाएगा और एक for ofलूप पर जारी रहेगा :

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];

for (const iterator of objc) {
  if (iterator.name == 2) {
    continue;
  }
  console.log(iterator.name); // 1  , 3
}

धन्यवाद, यह मुझे बहुत मदद करता है, मैं नोड का उपयोग कर रहा हूं और रिटर्न मेरे लिए, प्रत्येक के लिए और ... के लिए तोड़ रहा है, मैं उम्मीद की तरह काम करता हूं
veroneseComS

5

हां, एक बार returnस्टेटमेंट निष्पादित हो जाने पर, पूरा फ़ंक्शन उसी बिंदु पर बाहर निकल जाता है।

जरा सोचिए कि अगर ऐसा नहीं होता और returnहर बार उस बयान को जारी रखा जाता, तो क्या होता ? जब आप इसके बारे में सोचते हैं तो यह मूल्य वापस करने का अर्थ अमान्य कर देगा।


1

उत्तर हां है, यदि आप रिटर्न स्टेटमेंट लिखते हैं तो नियंत्रण तुरंत कॉलर विधि पर वापस चला जाता है। अंत में ब्लॉक के अपवाद के साथ, जो रिटर्न स्टेटमेंट के बाद निष्पादित हो जाता है।

और अंत में आपके द्वारा लौटाए गए मान को भी ओवरराइड कर सकते हैं, यदि आप अंततः ब्लॉक के अंदर वापस आते हैं। लिंक: कोशिश-कैच-आखिर-वापसी स्पष्टीकरण

प्रति कथन परिभाषा परिभाषा के अनुसार:

जावा डॉक्स:

रिटर्न स्टेटमेंट का उपयोग कंट्रोल फ्लो ब्लॉक से बाहर शाखा करने और विधि से बाहर निकलने के लिए किया जा सकता है

MSDN प्रलेखन:

रिटर्न स्टेटमेंट किसी फ़ंक्शन के निष्पादन को समाप्त करता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटाता है। कॉल के तुरंत बाद बिंदु पर कॉलिंग फ़ंक्शन में निष्पादन शुरू हो जाता है।

विकिपीडिया:

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


आपको अपने द्वारा उपयोग किए जाने वाले स्रोतों को ठीक से लिंक करने की आवश्यकता है, और आदर्श रूप में उद्धरणों को भी प्रारूपित करना है।
नाथन तुग्गी

क्या अब ठीक लग रहा है?
user1179299

मैं व्याकरण सुधारों की सराहना करता हूं, लेकिन अभी भी कोई लिंक नहीं हैं, और आप अभी भी ब्लॉकवॉक फॉर्मेटिंग का उपयोग नहीं कर रहे हैं।
नाथन तुग्गी

0

"वापसी" फ़ंक्शन से बाहर निकलता है, लेकिन यदि आप डेटा की बड़ी मात्रा को वापस करना चाहते हैं, तो आप इसे एक सरणी में स्टोर कर सकते हैं और फिर डेटा के प्रत्येक टुकड़े को 1 से 1 लूप में वापस करने की कोशिश करने के बजाय इसे वापस कर सकते हैं।

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