JavaScript เทียบเท่ากับ die ของ PHP


102

มีบางอย่างเช่น "ตาย" ใน JavaScript หรือไม่? ฉันได้ลองใช้ "break" แต่ไม่ได้ผล :)


2
ดูสิ่งนี้: stackoverflow.com/questions/550574/…
stefita

"die" เช่น "goto" ไม่สอดคล้องกับการเขียนโปรแกรมแบบมีโครงสร้าง ไม่ควรใช้คำแนะนำประเภทนี้สำหรับโครงการที่ร้ายแรง en.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}หรือบางสิ่งบางอย่าง XD มีตัวเลือกที่ดีกว่ามากมาย แต่ก็ใช้ได้ผล อาจจะดีสำหรับการดีบักหากคุณต้องการเรียกใช้สคริปต์ส่วนแรกเท่านั้นเพื่อให้แน่ใจว่าทำงานได้
Niet the Dark Absol

@stefita ทำไมความคิดเห็นของคุณถึงไม่เป็นคำตอบ ?? ทางออก () คือสิ่งที่ฉันต้องการ อีกวิธีหนึ่งคือการเรียกใช้ลูปการโทรอัตโนมัติจะทำงาน 1599 ครั้งจากนั้นหยุดการดำเนินการ ขอบคุณ.
m3nda

@AdrianMaire หัวใจของคุณอยู่ในสถานที่ที่เหมาะสม แต่ "ทำไม" ของคำถามไม่ควรเป็นปัญหา ความชั่วร้ายของdie, goto, evalฯลฯ ซากไม่รู้จบ (และไม่ได้ไม่มีบุญ) แต่พวกเขาทั้งหมดมีความหมายพิเศษของพวกเขาโดยเฉพาะอย่างยิ่งสำหรับการแก้จุดบกพร่องในระดับต่ำ มิฉะนั้นภาษาจะไม่รวมไว้ ในกรณีนี้ JS เทียบเท่าreturnและthrowไม่มีพิษภัยเพียงพอ
Beejor

คำตอบ:


34

คุณสามารถbreakกำหนดขอบเขตการบล็อกได้หากคุณติดป้ายกำกับ ตัวอย่างเช่น:

myBlock: {
  var a = 0;
  break myBlock;
  a = 1; // this is never run
};
a === 0;

คุณไม่สามารถทำลายขอบเขตการบล็อกจากภายในฟังก์ชันในขอบเขต ซึ่งหมายความว่าคุณไม่สามารถทำสิ่งต่างๆเช่น:

foo: { // this doesn't work
  (function() {
    break foo;
  }());
}

คุณสามารถทำสิ่งที่คล้ายกันได้ด้วยฟังก์ชัน:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}

5
ฉันไม่เคยรู้เกี่ยวกับการติดป้ายกำกับขอบเขตการเขียนบล็อกเลยแม้แต่น้อย หมายความว่าfoo: {}เป็นวัตถุหรือไม่?
enchance

3
ไม่ใช่มันเป็นขอบเขตการบล็อก เหมือนกับfoo: if(true){...}
Eli Gray

มีทางเลือกอื่นหรือไม่เนื่องจากคุณไม่สามารถ "ทำลายขอบเขตการบล็อกจากภายในฟังก์ชันในขอบเขต" ได้
haykam

209
throw new Error("my error message");

7
นี่คือคำตอบอย่างแน่นอนและใช้งานได้เหมือนกับ die (); อย่างไรก็ตามเราไม่ควรสนใจ "1 Error" สีแดงของ firebug!
Alexar

3
ฉันคิดว่าถ้า PHP มี "firebug" เทียบเท่าก็ควรเขียน "1 error" บน die () ;-) คำตอบที่ดี!
Adrian Maire

1
สิ่งนี้จะไม่สร้างกล่องโต้ตอบคำเตือนใน IE8 หรือไม่?
sbichenko

ไม่ใช่การเทียบเท่า 1 ต่อ 1 เนื่องจาก PHP มีข้อยกเว้นเช่นกัน
Brilliand

สิ่งนี้จะไม่หยุดการดำเนินการ AFAIK โดยสิ้นเชิง แต่เป็นเพียงแค่รอบ ๆ การโยนเท่านั้น ข้อมูลจำเพาะเบลอมาก แต่ฉันค่อนข้างมั่นใจว่าสคริปต์สามารถทำงานต่อไปที่อื่นได้
Rolf

22

คุณสามารถใช้return;ตัวอย่าง

$(document).ready(function () {
        alert(1);
        return;
        alert(2);
        alert(3);
        alert(4);
});

ผลตอบแทนจะกลับไปที่ฟังก์ชันผู้โทรหลัก test1 (); และดำเนินการต่อจากที่นั่นถึง test3 ();

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    return;
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

แต่ถ้าคุณเพิ่มการโยน ''; สิ่งนี้จะหยุดการดำเนินการโดยสมบูรณ์โดยไม่ก่อให้เกิดข้อผิดพลาดใด ๆ

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    throw '';   
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

ทดสอบกับ firefox และ chrome ฉันไม่รู้ว่า IE หรือ Safari จัดการเรื่องนี้อย่างไร


2
เท่าที่ฉันทราบreturnออกจากฟังก์ชันปิดล้อมเท่านั้น จะไม่ทำงานเมื่อคุณต้องการหยุดเรียกใช้สคริปต์ทั้งหมด
André Leria

1
อืมใช่คุณพูดถูกมันไม่ได้หยุดการทำงานของสคริปต์ทั้งหมด
themhz

throw "": ... โดยไม่ก่อให้เกิดข้อผิดพลาดใด ๆ ... - ไม่มาก ...Uncaught ""
FZs

15

เพียงแค่โทรdie()โดยไม่เคยกำหนดมัน สคริปต์ของคุณจะผิดพลาด :)

เมื่อฉันทำเช่นนี้ฉันมักจะเรียกdiscombobulate()แทน แต่หลักการเหมือนกัน

(อันที่จริงสิ่งนี้คือการโยน a ReferenceErrorทำให้ใกล้เคียงกับคำตอบของ spudly - แต่พิมพ์สั้นกว่าเพื่อวัตถุประสงค์ในการดีบัก)


การใช้ตัวระบุที่ไม่ได้กำหนดเองนั้นสร้างสรรค์มาก! ฉันชอบวิธีที่dieใช้งานง่ายและกระชับ ไม่มีประโยชน์ในthrowการบันทึกข้อความแสดงข้อผิดพลาดที่เฉพาะเจาะจง แต่บางครั้งเพียงแค่หมายเลขบรรทัดก็เพียงพอแล้ว BTW die;โดยไม่มีวงเล็บ (un-) ก็ใช้ได้เช่นกัน
Beejor

หรือแค่ตาย ที่บรรทัดที่คุณต้องการให้จาวาสคริปต์ของคุณหยุด
MarcoZen

คำตอบนี้โดนใจ JS มาก ^^ ไม่สกปรกถ้าได้ผล!
Yonn Trimoreau

9

หากคุณใช้ nodejs คุณสามารถใช้

process.exit(<code>);

4
หากเป็นเรื่องเกี่ยวกับ node.js คำถามจะมี tag node.js
FelixSFD

3
@FelixSFD: ยังช่วยฉันได้ในขณะที่ฉันกำลังค้นหาสิ่งนี้โดยไม่คำนึงถึงแท็กโดยสิ้นเชิง;)
DE

7

เป็นไปได้ที่จะม้วนเวอร์ชัน PHP ของคุณเอง:

function die(msg)
{
    throw msg;
}

function test(arg1)
{
    arg1 = arg1 || die("arg1 is missing"); 
}

test();

ตัวอย่าง JSFiddle


var a = arguments[3] || die('message')ผมอยากจะพูดถึงว่านี้จะไม่ทำงานในกรณีเช่น แต่ฉันคิดว่าควรจะตาย: function die(msg) { return eval(`throw "${msg}"`);)แต่ถึงอย่างนั้นฉันคิดว่ามันควรจะวางยากบนเส้นที่แตกเพื่อให้ข้อผิดพลาดแสดงว่าบรรทัดใดล้มเหลวเช่น this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

อาจไม่แน่ใจว่า eval () จะแก้ปัญหาได้ถ้าฉันเข้าใจคุณ ตามหลักการแล้วเราจะดูสแต็กแทร็กหากคุณสนใจว่าความล้มเหลวเกิดขึ้นจริง ไม่เช่นนั้นฉันคิดว่ามันปลอดภัยที่จะสมมติว่าคุณเพียงแค่ต้องการรายงานข้อความความล้มเหลวพื้นฐานบางอย่างให้กับผู้ใช้ของคุณ
Kelmar

3

ใช้ firebug และรุ่งโรจน์ ...

debugger;

และอย่าปล่อยให้ดีบักเกอร์ก้าวไปข้างหน้า สะอาดกว่าการขว้างปาที่เหมาะสมErrorหรือไม่?


2
ไม่เหมือนเดิมแน่นอน!
Rolf

2

ไม่มี equaliant แน่นอนของภาษาสร้างเป็นdieของ PHP ในJavascript dieใน PHP นั้นค่อนข้างเท่ากับSystem.exit()ในJavaซึ่งจะยุติสคริปต์ปัจจุบันและเรียกใช้ shutdown hooks ตามที่ผู้ใช้บางคนแนะนำ; throw Errorสามารถใช้ได้ในบางกรณีอย่างไรก็ตามจะไม่รับประกันการยุติสคริปต์ปัจจุบัน อาจมีบล็อกการจัดการข้อยกเว้นล้อมรอบthrowคำสั่งของคุณได้เสมอเว้นแต่คุณจะเรียกมันในบล็อกสคริปต์ระดับบนสุดซึ่งในที่สุดจะออกเฉพาะบล็อกสคริปต์ที่คุณกำลังดำเนินการ

อย่างไรก็ตามจะไม่ป้องกันไม่ให้ดำเนินการบล็อกที่สองที่นี่ (พิมพ์สวัสดี):

<script type="text/javascript">
  throw new Error('test');
</script>
<script type="text/javascript">
  document.write("hello");
</script> 

2

ไม่มีฟังก์ชัน exit ที่เทียบเท่ากับ php die () ใน JS หากคุณไม่ได้ใช้ฟังก์ชันใด ๆ คุณสามารถใช้ return;

return;


0

คุณสามารถใช้ return false; การดำเนินการนี้จะยุติสคริปต์ของคุณ


3
เฉพาะในระดับบนสุดสันนิษฐาน. die () ของ PHP สามารถเรียกได้ทุกระดับและจะทำให้ PHP interpreter หายไปที่นั่น
Rolf

0

ควรทำงานแบบนี้เช่น die ();

function die(msg = ''){
    if(msg){
        document.getElementsByTagName('html')[0].innerHTML = msg;
    }else{
        document.open();
        document.write(msg);
        document.close();
    }
    throw msg;
}

0

ฟังก์ชัน Global die () เพื่อวัตถุประสงค์ในการพัฒนา:

var die = function(msg) {
    throw new Error(msg);
}

ใช้แม่พิมพ์ ():

die('Error message here');

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