ออกจากฟังก์ชั่นก่อน?


402

ฉันมีฟังก์ชั่น:

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

มีอะไรexit()ใน JavaScript บ้างไหม?


4
คุณต้องการที่จะหยุดการดำเนินการหรือกลับมา?
Ken Struys

@ เคน Struys ความแตกต่างคืออะไร? อย่างที่ฉันเข้าใจถ้าฉันคืนมันจะหยุดการประหารหรือไม่? ไม่ใช่เหรอ
Simon

3
นี่คือสิ่งที่ใช้คืนจะเพียงกลับไปที่บริบทของฟังก์ชั่นการโทร ถ้าคุณต้องการให้ semantic exit ที่คุณต้องการหยุดการประมวลผลคุณสามารถทำสิ่งนี้: vikku.info/codesnippets/javascript/…
Ken Struys

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
ฉันรู้ว่านี่เป็นโพสต์เก่าและนี่เป็นเรื่องธรรมดา แต่ฉันคิดว่านี่เป็นวิธีที่ไม่ดี หากฟังก์ชันนี้สนับสนุนให้ส่งคืนค่าคุณควรใช้ return หากคุณเพิ่งใช้คืนแบบสุ่มคุณอาจพบปัญหาในภายหลัง โดยเฉพาะอย่างยิ่งถ้าคุณเริ่มผูกพันเหตุการณ์ที่มีผลตอบแทนในพวกเขา ตรวจสอบโพสต์นี้สำหรับข้อมูลเพิ่มเติม: fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme: ฟังก์ชั่นใน JavaScript จะกลับมาเสมอ คำสั่งส่งคืนจะมีความหมายหากยังไม่ได้รับ ค่าตอบแทนเริ่มต้นคือundefinedและนั่นคือสิ่งที่โซลูชั่นหลักของฉันให้ บทความที่คุณอ้างถึงกำลังพูดถึงการทำreturn falseใน jQuery event handler นั่นเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง นี่เป็นวิธีที่เหมาะสมในการออกจากฟังก์ชั่น JavaScript เห็นได้ชัดว่าหากผู้เรียกใช้ค่าที่ส่งคืนจะต้องมีการกำหนดค่าอย่างเหมาะสม
user113716

3
... เปลี่ยนแปลงโดยนัยก็if(a != 'stop') { /* run my code */ }เพื่อให้รหัสเท่านั้นทำงานเมื่อaไม่เท่ากับโดยไม่ต้องให้ชัดเจน'stop' returnแต่ค่าตอบแทนเป็นเหมือนการแก้ปัญหาของฉัน ในทั้งสองกรณีundefinedจะถูกส่งกลับ
user113716

3
การตอบสนองที่ยอดเยี่ยม ฉันไม่ทราบว่ามีความแตกต่างใด ๆ ระหว่างการคืนค่าที่ไม่ได้กำหนดเทียบกับเท็จและค่าที่แตกต่าง ฉันพยายามค้นหาคำตอบที่ชัดเจนเกี่ยวกับพฤติกรรมนี้ในชั่วโมงที่ผ่านมา ดังนั้นจึงปลอดภัยที่จะพูด (เพื่อย้ำจุดของคุณ) ที่กลับมาเป็นวิธีที่ปลอดภัย 100% เพื่อออกจากวิธีการแม้ว่าผู้โทรจะผูกพันกับเหตุการณ์ ฯลฯ ?

@ dbme: มันทั้งหมดขึ้นอยู่กับสิ่งที่คาดหวังโดยวิธีการเรียกฟังก์ชั่น หากห้องสมุดโค้ดบางแห่งกำหนดระบบเหตุการณ์ที่จะทำให้แตกหากได้รับundefined(หรือไม่ได้รับค่าอื่น ๆ ) เป็นค่าส่งคืนคุณจะต้องปฏิบัติตามข้อกำหนดของ API นั้นและส่งคืนค่าที่ถูกต้อง โดยทั่วไปสำหรับระบบการจัดการเหตุการณ์มันจะคาดหวังว่า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

ฉันยังไม่เห็นข้อเสีย แต่ดูเหมือนจะไม่ใช้งานทั่วไป

ได้รับคำตอบนี้: JavaScript เทียบเท่ากับการตายของ PHP


เป็นไปได้หรือไม่ที่จะใช้โซลูชันนี้กับโมดูลการเอ็กซ์พอร์ต nodejs? เมื่อฉันลองฉันจะได้รับข้อผิดพลาด "ไม่ได้ใช้ป้ายกำกับ" exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; ดีกว่าเพียงแค่ return;


13
ทำไมถึงfalseดีกว่า ฉันว่าค่าเริ่มต้นundefinedดีกว่าในกรณีทั่วไป ทั้งสองวิธีคุณถูกต้องที่จะบอกว่ามักจะดีกว่าที่จะคืนค่าที่มีความหมาย
แบรดโคช์ส

มันขึ้นอยู่กับโปรแกรมเมอร์และขึ้นอยู่กับกรณีการใช้งาน ยกตัวอย่างเช่นฟังก์ชั่นการตรวจสอบอาจจะมีอะไรบางอย่างดังนั้นหากตรวจสอบล้มเหลวมันทำให้รู้สึกมากขึ้นเพื่อกลับกว่าfalse undefined
Adam McArthur


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

การใช้returnจะหยุดฟังก์ชั่นและการคืนundefinedค่าหรือค่าที่คุณระบุด้วยคำสั่ง return

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 ที่ซ้อนกันขนาดใหญ่ ขอบคุณ
Debbie

นี่จะดีกว่าเมื่อใช้สวิตช์
bdelmas

ขึ้นอยู่กับว่าคุณต้องการให้มีการแจ้งเตือนข้อผิดพลาดทั้งหมดในครั้งเดียวหรือไม่และจะได้รับการแจ้งเตือนเพียงครั้งเดียว อย่างไรก็ตามแต่ละเงื่อนไขจะต้องดำเนินการต่อไป
Leo

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);
}

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



-4

หากคุณกำลังใช้ jquery สิ่งนี้ควรหยุดฟังก์ชั่นจากเดือดปุด ๆ จนฟังก์ชั่นหลักที่เรียกสิ่งนี้ควรหยุดเช่นกัน

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

6
stopImmediatePropagation()ไม่ใช่ jQuery สิ่งและการหยุดการเผยแพร่ไม่ใช่สิ่งเดียวกับการออกจากฟังก์ชัน
แบรดโคช์

-13

พิมพ์คำสั่งแบบสุ่มใด ๆ ที่ส่งข้อผิดพลาดตัวอย่างเช่น:

exit

หรือ

die:-)

สิ่งนี้อาจหยุดโค้ดทั้งหมดจากการถูกดำเนินการไม่เพียง แต่ฟังก์ชั่นที่เหลือ ตรวจสอบซอ: jsfiddle.net/b3k0xo7n/1
treecon

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