จะยุติสคริปต์ใน JavaScript ได้อย่างไร?


149

ฉันจะออกจากสคริปต์ JavaScript เหมือนของ PHP exitหรือdie? ฉันรู้ว่ามันไม่ใช่วิธีการเขียนโปรแกรมที่ดีที่สุด แต่ฉันต้องการ


1
คุณคิดว่าคุณสามารถขยายข้อกำหนดนี้ได้หรือไม่ทำไมคุณถึงพยายามทำให้สำเร็จ
andynormancx

8
@andynormancx นี่อาจเป็นประโยชน์สำหรับการดีบัก
ตลาดหลักทรัพย์

3
เพียงแค่return;อาจจะมากพอที่ขึ้นอยู่กับความต้องการของคุณทำหน้าที่เหมือนตาย () โดยไม่มีพารามิเตอร์
Ishikawa

2
ถ้าคุณ“ ต้องการ” มันคุณอาจจะคิดว่าการออกแบบของคุณดีกว่า
Frungi

18
ทำไมคำถามแรกคือ 'ทำไม' เสมอ
john ktejik

คำตอบ:


80

เทียบเท่า JavaScript สำหรับของ diePHP BTW มันเพิ่งจะโทรexit()(ขอบคุณ splattne):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}

1
นี่คือรหัสแหล่งที่มาของการออกจาก: kevin.vanzonneveld.net/techblog/article/...
splattne

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

2
แนวคิดการตายทั้งหมดนั้นแตกหักไปเล็กน้อย - การไหลควรมีความสามารถในการจัดการใด ๆ และทุกเหตุการณ์ไม่ว่าจะเป็นความพยายามในการจับหรือไม่ก็ตาม
annakata

ฉันคิดว่าคุณไม่ได้รวมกิจกรรมทั้งหมดที่ควรจัดการเช่นเหตุการณ์ "selectstart"
Ono Oogami

4
คุณไม่สามารถหยุดตัวจัดการ XMLHttpRequest รหัสปัจจุบันไม่ได้หยุดช่วงเวลาหรือหมดเวลาจากการดำเนินการ การสาธิต: jsfiddle.net/skibulk/wdxrtvus/1 คุณอาจคิดว่านี่เป็นการแก้ไข: stackoverflow.com/a/8860203/6465140
skibulk

73

ฟังก์ชัน "exit" มักจะออกจากโปรแกรมหรือสคริปต์พร้อมกับข้อความแสดงข้อผิดพลาดว่าเป็นพารามิเตอร์ เช่น die (... ) ใน php

die("sorry my fault, didn't mean to but now I am in byte nirvana")

สิ่งที่เทียบเท่าใน JS คือส่งสัญญาณข้อผิดพลาดด้วยคำสำคัญthrowเช่นนี้:

throw new Error();

คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดาย:

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100

46
@Sydwell: หากคุณล้อมรอบด้วยบล็อก catch มันจะถูกจับและโปรแกรมจะไม่ยุติท้าทายจุดที่นี่
สุดยอด

4
อย่าลืมว่าคุณสามารถเพิ่มข้อความลงในข้อผิดพลาดได้: โยนข้อผิดพลาดใหม่ ('variable =' + x); เป็นวิธีที่ดีในการสิ้นสุดสคริปต์อย่างรวดเร็วในขณะที่คุณกำลังดำเนินการกับสคริปต์และรับค่าของตัวแปร
Andrew Swift

1
@ultimate ฉันคิดว่า #Sydwell บอกให้ห่อสคริปต์ทั้งหมดไว้ใน try / catch ดังนั้นคุณจะได้รับ a) clean exit b) ข้อความ exception ที่เป็นไปได้เมื่อจำเป็น :) การโยนข้อยกเว้นที่ไม่จำเป็นโดยทั่วไปแล้วไม่ได้ทำให้ดี :)
jave.web

47

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

<script> 
function main()
{
//code

}
main();
</script>

วิธีนี้เมื่อคุณต้องการหยุดโปรแกรมคุณสามารถใช้ "return"


15

หากคุณไม่สนใจว่ามันเป็นข้อผิดพลาดเพียงแค่เขียน:

fail;

สิ่งนี้จะหยุดรหัสหลักของคุณ (ส่วนกลาง) จากการดำเนินการต่อ มีประโยชน์สำหรับการดีบัก / ทดสอบในบางด้าน


1
window.failไม่ได้กำหนดไว้ในเบราว์เซอร์ปัจจุบัน
mikemaccana

7
นั่นคือประเด็น - คุณสามารถทำได้mikeyMouse;- ข้อผิดพลาดจะยุติลง มันรวดเร็วและสกปรก
Marc

1
อายุติธรรมพอ - อาจเพิ่มคำตอบของคุณ?
mikemaccana

13

มีหลายวิธีในการออกจากสคริปต์ JS หรือโหนด นี่คือสิ่งที่เกี่ยวข้องมากที่สุด:

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

หากคุณอยู่ในREPL (เช่นหลังจากทำงานnodeบนบรรทัดคำสั่ง) คุณสามารถพิมพ์.exitเพื่อออก


ฉันไม่ต้องการดูถูกสติปัญญาของผู้อ่านโดยการอธิบายคำย่อที่ปรากฏขึ้นเป็นผลครั้งแรกของ Googling ฉันขอแนะนำให้คุณอย่าผสมรหัส JavaScript กับคำสั่ง REPL เพราะหากผู้ใช้คัดลอก / วางรหัสนั้นปิดกั้นและเรียกใช้พวกเขาจะได้รับข้อผิดพลาดทางไวยากรณ์ในบรรทัด ". ออก"
Dan Dascalescu


5

วางdebugger;คำหลักในรหัส JavaScript ของคุณที่คุณต้องการหยุดการดำเนินการ จากนั้นเปิดเครื่องมือนักพัฒนาของเบราว์เซอร์ที่คุณชื่นชอบแล้วโหลดหน้าซ้ำ ตอนนี้มันควรหยุดโดยอัตโนมัติ เปิดส่วนแหล่งที่มาของเครื่องมือของคุณ: debugger;คำหลักถูกเน้นและคุณมีตัวเลือกเพื่อดำเนินการสคริปต์ต่อ

ฉันหวังว่ามันจะช่วย

ข้อมูลเพิ่มเติมได้ที่:


2

ฉันคิดว่าคำถามนี้ได้รับคำตอบคลิกที่นี่สำหรับข้อมูลเพิ่มเติม ด้านล่างนี้เป็นคำตอบสั้น ๆ ที่โพสต์

throw new Error("Stop script");

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

สำหรับข้อมูลจุดพักของ Chrome คลิกที่นี่
สำหรับข้อมูลจุดพักของ Firefox คลิกที่นี่
สำหรับข้อมูลจุดพักของ Explorer คลิก
สำหรับข้อมูลจุดพักของ Safari คลิกที่นี่


1

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

โปรดทราบว่าในทางปฏิบัติล่าม Javascript ของเบราว์เซอร์ส่วนใหญ่จะหยุดใช้สคริปต์ปัจจุบันหากพบข้อผิดพลาด ดังนั้นคุณสามารถทำสิ่งต่าง ๆ เช่นเข้าถึงแอตทริบิวต์ของตัวแปร unset:

function exit() {
    p.blah();
}

และมันอาจจะยกเลิกสคริปต์ แต่คุณไม่ควรคาดหวังสิ่งนั้นเพราะมันไม่ได้มาตรฐานและดูเหมือนว่ามันจะเป็นวิธีที่แย่มาก

แก้ไข : ตกลงบางทีนี่อาจไม่ใช่คำตอบที่ดีในแง่ของ aflafur แม้ว่าdie()ฟังก์ชั่นที่เขาเชื่อมโยงจะใช้ย่อหน้าที่สองของฉันโดยพื้นฐานแล้วมันก็แค่เกิดข้อผิดพลาด


1
ทุกสิ่งที่จะทำจะหยุดบิตการเรียกใช้งานสคริปต์ปัจจุบัน มันจะไม่หยุดเหตุการณ์ใหม่จากการเริ่มและเรียกใช้สคริปต์ใหม่
andynormancx

ไม่ต้องพูดถึงคุณไม่จำเป็นต้องมีฟังก์ชั่นที่ไม่ดีเป็นพิเศษในการโยนข้อผิดพลาด Javascript มีข้อความสั่งการในตัว
Chris

ฟังก์ชั่นตายทำมากกว่า p.blah () ของคุณมันทำงานผ่านเหตุการณ์ windows และแทนที่หมายเลขอ้างอิงที่มีด้วย "e.preventDefault (); e.stopPropagation ();" ซึ่งจะหยุดการยิงเหตุการณ์ จากนั้นจะส่งข้อยกเว้น
andynormancx

1

โยน "";

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

ด้านบนของมัน: คุณต้องการหน้าซึ่งรายงานให้คุณทางอีเมลทันทีที่มันพ่น - คุณสามารถใช้เช่น Raven / Sentry สำหรับสิ่งนี้ แต่นั่นหมายความว่าคุณสร้างผลบวกที่ผิดพลาดให้กับตัวเอง ในกรณีเช่นนี้คุณต้องอัปเดตตัวจัดการเริ่มต้นเพื่อกรองเหตุการณ์ดังกล่าวออกหรือตั้งค่าเหตุการณ์ดังกล่าวโดยไม่สนใจบนแผงควบคุมของ Sentry

window.stop ();

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

ดีบักเกอร์;

หยุดการทำงานเมื่อเปิดดีบักเกอร์เท่านั้น ใช้งานได้ดี แต่ไม่สามารถส่งมอบได้


1

ใน JavaScript มีหลายวิธีด้านล่างคือบางวิธี

วิธีที่ 1:

throw new Error("Something went badly wrong!");

วิธีที่ 2:

return;

วิธีที่ 3:

return false;

วิธีที่ 4:

new new

วิธีที่ 5:

เขียนฟังก์ชั่นที่กำหนดเองของคุณใช้วิธีการข้างต้นและโทรในที่ที่คุณต้องการ

หมายเหตุ: หากคุณต้องการหยุดการใช้รหัสชั่วคราวคุณสามารถใช้งานได้

debugger; 

0

ฟังก์ชั่นเล็ก ๆ น้อย ๆ นี้มาใกล้กับการเลียนแบบการออกจาก PHP () เช่นเดียวกับโซลูชันอื่น ๆ อย่าเพิ่มอะไรอีก

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

0

เพียงสร้างเงื่อนไขบูลไม่จำเป็นต้องใช้รหัสที่ซับซ้อนที่นี่ ..

หากแม้เมื่อคุณเปลี่ยนเป็นจริง / หรือหลายครั้งทั้งสองจะให้หนึ่งบรรทัดของการแก้ปัญหา / ไม่หลาย - โดยทั่วไปง่ายเหมือนที่


0

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

ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการหยุดสคริปต์ หากมีวิธีอื่นใดโปรดแสดงความคิดเห็นฉัน ฉันต้องการทราบวิธีที่ดีที่สุดและเรียบง่ายอีกด้วย BTW ฉันไม่ได้รับฟังก์ชั่น exit หรือ die inbuilt ใน Javascript เช่น PHP เพื่อยุติสคริปต์ หากใครรู้แล้วโปรดแจ้งให้เราทราบ

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');

0

หากคุณเพียงต้องการหยุดโค้ดเพิ่มเติมจากการดำเนินการโดยไม่มีข้อผิดพลาด "การขว้างปา" คุณสามารถแทนที่ชั่วคราวwindow.onerrorดังที่แสดงในcross-exit:

function exit(code) {
    const prevOnError = window.onerror
    window.onerror = () => {
        window.onerror = prevOnError
        return true
    }

    throw new Error(`Script termination with code ${code || 0}.`)
}

console.log("This message is logged.");
exit();
console.log("This message isn't logged.");


0

ไม่สามารถใช้ได้ในสถานการณ์ส่วนใหญ่ แต่ฉันมีสคริปต์ async จำนวนมากที่ทำงานในเบราว์เซอร์และเป็นแฮ็คที่ฉันทำ

window.reload();

เพื่อหยุดทุกอย่าง


0

ฉันรู้ว่ามันเก่า แต่ถ้าคุณต้องการdie()ฟังก์ชั่นPHP ที่คล้ายกันคุณสามารถทำได้:

function die(reason) {
    throw new Error(reason);
}

การใช้งาน:

console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");

ตัวอย่างด้านบนจะพิมพ์เฉพาะ "Hello"


-1

ฉันใช้โค้ดส่วนนี้เพื่อหยุดการทำงาน:

throw new FatalError("!! Stop JS !!");

คุณจะได้รับข้อผิดพลาดของคอนโซล แต่มันใช้งานได้ดีสำหรับฉัน


-2

นี่คือตัวอย่างที่หากมีเงื่อนไขอยู่ให้ยกเลิกสคริปต์ ฉันใช้สิ่งนี้ในจาวาสคริปต์ฝั่งไคลเอ็นต์ SSE ของฉันหาก

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

สามารถแยกวิเคราะห์ได้จากการแยก JSON ...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

... อย่างไรก็ตามแนวคิดทั่วไปคือ:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

สิ่งนี้จะยุติ / ตายสคริปต์ javasript ของคุณ


1
นี่ไม่ได้ตอบคำถามจริงๆ พวกเขากำลังพูดถึงปัญหาทั่วไปไม่มีอะไรเกี่ยวข้องกับตัวแปร / ไฟล์ SSE เฉพาะของคุณ
mjk

1
mjk - ดีกว่าตอนนี้?
kapad

-3

ฉันใช้คำสั่งส่งคืนแทนที่จะโยนเป็นโยนให้ข้อผิดพลาดในคอนโซล วิธีที่ดีที่สุดที่จะทำคือตรวจสอบสภาพ

if(condition){
 return //whatever you want to return
}

สิ่งนี้จะหยุดการทำงานของโปรแกรมจากบรรทัดนั้นแทนที่จะให้ข้อผิดพลาดใด ๆ ในคอนโซล


1
อย่างไรก็ตามให้ข้อผิดพลาดใน linters ของคุณเป็น "ไม่สามารถใช้ 'คืน' นอกฟังก์ชั่น"
Carles Alcolea

มันหยุดการดำเนินการเพราะคำสั่งไม่ถูกต้อง นอกจากนี้คุณยังสามารถใช้หรือif (condition) { new new } if (condition) { purpleMonkeyDishwasher(); }
Coderer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.