ผลตอบแทนหยุดวนซ้ำหรือไม่?


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** ออกจากฟังก์ชันทันทีโดยไม่ต้องดำเนินการใด ๆ หากอยู่ในลูป for

มันได้รับการยืนยันอย่างง่ายดายสำหรับตัวคุณเอง:

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

alert(returnMe());
// 1

** หมายเหตุ: ดูคำตอบอื่น ๆเกี่ยวกับกรณีพิเศษtry/catch/finally และคำตอบนี้เกี่ยวกับวิธีการวนรอบแต่ละครั้งที่มีขอบเขตฟังก์ชันของตัวเองจะไม่แยกออกจากฟังก์ชันที่มี


25
> return ออกจากฟังก์ชันทันทีโดยไม่ต้องดำเนินการใด ๆ หากอยู่ภายในลูป... เว้นแต่ว่าจะเป็นลูป forEach แต่ละครั้ง
oo

9
@oo เรียงจากจริง returnยังคงกลับมาจากการย้ำปัจจุบันของการเรียกกลับทำงานอยู่ในขอบเขตของตัวเอง forEach()แต่จะไม่ได้คาดว่าจะแบ่งจากวิธีการโทรทั้งหมด ดังนั้นมันจึงไม่กลับมาจากลูปแต่จะกลับมาจากการเรียกกลับที่ลูปเรียกใช้งาน ในตัวอย่างรหัสจากคำถามที่เชื่อมโยงผลลัพธ์จะถูก1,2,4,5ข้าม3เนื่องจากการส่งคืน
Michael Berkowski

บางทีเธรดสีแดงนั้นreturnจะกลับมาจากthisบริบทปัจจุบันเสมอ
oo

ทางเลือกอื่นในการใช้ forEach () หรือสำหรับ () ในอาเรย์สำหรับการเลิกใช้ลูปก่อนกำหนด“ อาจจะ” กำลังใช้ ()
AnBisw

1
ฉันรู้ว่านี้เป็นที่น่ารำคาญสำหรับบางคน แต่นี้เป็นความรู้ที่ดีเพื่อให้เพราะคุณไม่ต้องแล้วbreak return
NoName

60

ในกรณีส่วนใหญ่ (รวมถึงอันนี้) returnจะออกทันที แต่ถ้ากลับมาอยู่ในtryบล็อกที่มีมาพร้อมกับfinallyบล็อกที่finallyมักจะดำเนินการและจะสามารถ "แทนที่ว่า" ในreturntry

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

คำตอบคือใช่ถ้าคุณเขียนคำสั่ง return การควบคุมจะกลับไปที่เมธอด caller ทันที ในที่สุดก็มีข้อยกเว้นของบล็อกซึ่งได้รับการดำเนินการหลังจากคำสั่งกลับมา

และในที่สุดก็สามารถแทนที่ค่าที่คุณส่งคืนได้หากคุณกลับมาอยู่ด้านในของบล็อกสุดท้าย ลิงค์: พยายามอธิบายให้ได้ผลตอบแทนสูงสุด

ส่งคืนคำนิยามคำชี้แจงตาม:

เอกสาร Java:

ข้อความสั่ง return สามารถใช้แยกสาขาของ flow flow block และออกจากเมธอด

เอกสาร MSDN:

คำสั่ง return จะยุติการใช้งานฟังก์ชั่นและคืนการควบคุมไปยังฟังก์ชั่นการโทร การดำเนินการดำเนินการต่อในฟังก์ชั่นการโทรที่จุดทันทีหลังจากการโทร

วิกิพีเดีย:

คำสั่ง return ทำให้การดำเนินการออกจากรูทีนย่อยปัจจุบันและกลับมาที่จุดในรหัสทันทีหลังจากที่มีการเรียกรูทีนย่อยเรียกว่าที่อยู่ผู้ส่ง ที่อยู่ผู้ส่งจะถูกบันทึกโดยปกติจะอยู่ในสแต็กการเรียกใช้ของกระบวนการซึ่งเป็นส่วนหนึ่งของการดำเนินการเรียกรูทีนย่อย ข้อความสั่งคืนในหลายภาษาอนุญาตให้ฟังก์ชันระบุค่าส่งคืนเพื่อส่งคืนกลับไปยังรหัสที่เรียกว่าฟังก์ชัน


คุณต้องเชื่อมโยงแหล่งข้อมูลที่คุณใช้อย่างถูกต้องและจัดรูปแบบคำพูดเช่นกัน
นาธาน Tuggy

ตอนนี้ดูไม่ดีเหรอ?
user1179299

ฉันขอขอบคุณการแก้ไขไวยากรณ์ แต่ยังไม่มีลิงก์ใด ๆ และคุณยังคงไม่ได้ใช้การจัดรูปแบบข้อความบล็อก
นาธาน Tuggy

0

"คืน" จะออกจากฟังก์ชั่น แต่ถ้าคุณต้องการส่งคืนข้อมูลจำนวนมากคุณสามารถเก็บไว้ในอาร์เรย์แล้วกลับมาแทนที่จะพยายามส่งคืนข้อมูล 1 ต่อ 1 แต่ละชิ้นในลูป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.