Bagaimana cara menghentikan skrip dalam JavaScript?

149

Bagaimana saya bisa keluar dari skrip JavaScript seperti PHP exitatau die? Saya tahu ini bukan praktik pemrograman terbaik, tetapi saya harus melakukannya.

Nir
sumber
1
Apakah Anda pikir Anda dapat memperluas persyaratan ini, mengapa Anda mencoba mencapai ini?
andynormancx
8
@andynormancx, ini mungkin berguna untuk debugging.
SET
3
hanya return;mungkin cukup tergantung pada kebutuhan Anda, bertindak seperti die () tanpa parameter.
Ishikawa
2
Jika Anda “membutuhkannya”, Anda mungkin lebih baik memikirkan kembali desain Anda.
Frungi
18
mengapa selalu pertanyaan pertama 'mengapa'?
john ktejik

Jawaban:

80

Setara dengan JavaScript untuk PHPdie . BTW itu hanya panggilan exit()(terima kasih 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 '';
}
Ólafur Waage
sumber
1
Berikut kode sumber keluar: kevin.vanzonneveld.net/techblog/article/…
splattne
Kode itu tampaknya tidak menghentikan peristiwa pada elemen dari penembakan, hanya peristiwa di jendela. Jadi, Anda juga perlu mengulang semua elemen di halaman melakukan hal yang serupa. Itu semua terdengar seperti persyaratan yang sangat aneh.
andynormancx
2
konsep seluruh die agak rusak - aliran harus mampu menangani setiap dan semua kemungkinan, apakah itu memerlukan mencoba-menangkap atau tidak.
annakata
Saya pikir Anda tidak menyertakan semua acara yang harus ditangani, seperti acara "selectstart".
Ono Oogami
4
Anda tidak bisa menghentikan penangan XMLHttpRequest. Kode saat ini tidak menghentikan interval atau batas waktu dari eksekusi. Demo: jsfiddle.net/skibulk/wdxrtvus/1 Anda mungkin menganggap ini sebagai perbaikan: stackoverflow.com/a/8860203/6465140
skibulk
73

Fungsi "keluar" biasanya keluar dari program atau skrip bersama dengan pesan kesalahan sebagai parameter. Misalnya mati (...) di php

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

Setara dengan JS adalah memberi sinyal kesalahan dengan kata kunci throw seperti ini:

throw new Error();

Anda dapat dengan mudah menguji ini:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
sumber
46
@Sydwell: Jika Anda mengelilinginya dengan catch block, itu akan ditangkap dan program tidak akan berakhir, menentang titik di sini.
ultimate
4
Jangan lupa bahwa Anda dapat menambahkan pesan ke error: throw new Error ('variable =' + x); Ini cara yang bagus untuk mengakhiri skrip dengan cepat saat Anda sedang mengerjakannya dan mendapatkan nilai variabel.
Andrew Swift
1
@ultimate Saya berpikir bahwa #Sydwell ment untuk membungkus seluruh skrip dalam try / catch, sehingga Anda bisa a) membersihkan pintu keluar b) pesan pengecualian yang mungkin bila diperlukan :) Melempar pengecualian yang tidak
disadari
47

Bahkan dalam program sederhana tanpa pegangan, acara dan semacamnya, yang terbaik adalah menempatkan kode dalam fungsi "utama", bahkan ketika itu adalah satu-satunya prosedur:

<script> 
function main()
{
//code

}
main();
</script>

Dengan cara ini, ketika Anda ingin menghentikan program, Anda dapat menggunakan "kembali".

Jhep
sumber
15

Jika Anda tidak peduli itu salah, tulis saja:

fail;

Itu akan menghentikan kode utama (global) Anda untuk melanjutkan. Berguna untuk beberapa aspek debugging / pengujian.

Marc
sumber
1
window.failtidak ditentukan di browser saat ini.
mikemaccana
8
Itulah intinya - Anda juga bisa melakukannya mikeyMouse;- kesalahan akan berakhir. Cepat dan kotor.
Marc
2
Ah cukup adil - mungkin menambahkan itu ke jawaban Anda?
mikemaccana
13

Ada banyak cara untuk keluar dari skrip JS atau Node. Inilah yang paling relevan:

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

Jika Anda berada di REPL (yaitu setelah menjalankan nodepada baris perintah), Anda dapat mengetik .exituntuk keluar.

not2qubit
sumber
Saya tidak ingin menghina kecerdasan pembaca dengan menjelaskan akronim yang muncul sebagai hasil pertama dari Googling. Saya sarankan Anda tidak mencampur kode JavaScript dengan perintah REPL karena jika pengguna menyalin / menempelkan kode itu dan menjalankannya, mereka akan mendapatkan kesalahan Sintaks pada baris ".exit".
Dan Dascalescu
6

Dalam kasus saya, saya menggunakan window.stopAPI yang seperti mengklik tombol X pada browser Anda:

window.stop();
Musa
sumber
5

Tempatkan debugger;kata kunci dalam kode JavaScript Anda di mana Anda ingin menghentikan eksekusi. Kemudian buka alat pengembang browser favorit Anda dan muat ulang halaman tersebut. Sekarang ia akan berhenti secara otomatis. Buka bagian Sumber alat Anda: thedebugger; kata kunci disorot dan Anda memiliki opsi untuk melanjutkan eksekusi skrip.

Saya harap ini membantu.

Informasi lebih lanjut di:

di bawah
sumber
2

Saya pikir pertanyaan ini telah dijawab, klik di sini untuk informasi lebih lanjut. Di bawah ini adalah jawaban singkat yang diposting.

throw new Error("Stop script");

Anda juga dapat menggunakan browser Anda untuk menambahkan break point, setiap browser serupa, periksa info di bawah untuk browser Anda.

Untuk info break point Chrome klik di sini
Untuk info break point Firefox klik di sini
Untuk info break point Explorer klik
Untuk info break point Safari klik di sini

alfmonc
sumber
1

Jika Anda mencari cara untuk menghentikan eksekusi semua Javascript secara paksa pada halaman, saya tidak yakin ada cara yang disetujui secara resmi untuk melakukan itu - sepertinya hal yang mungkin merupakan risiko keamanan (meskipun untuk jujur, saya tidak bisa memikirkan bagaimana itu akan keluar dari kepala saya). Biasanya dalam Javascript ketika Anda ingin kode Anda berhenti berjalan, Anda hanya returndari fungsi apa pun yang dijalankan. (Itureturn Pernyataan ini opsional jika itu adalah hal terakhir dalam fungsi dan fungsi tidak boleh mengembalikan nilai). Jika ada beberapa alasan pengembalian tidak cukup baik untuk Anda, Anda mungkin harus mengedit lebih detail ke pertanyaan mengapa Anda berpikir Anda membutuhkannya dan mungkin seseorang dapat menawarkan solusi alternatif.

Perhatikan bahwa dalam praktiknya, sebagian besar penerjemah Javascript browser hanya akan berhenti menjalankan skrip saat ini jika mereka menemukan kesalahan. Jadi Anda dapat melakukan sesuatu seperti mengakses atribut dari variabel yang tidak disetel:

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

dan mungkin akan membatalkan skrip. Tetapi Anda tidak harus mengandalkan itu karena sama sekali tidak standar, dan itu benar-benar tampak seperti praktik yang mengerikan.

EDIT : Oke, mungkin ini bukan jawaban yang bagus mengingat Ólafur's. Meskipun die()fungsi yang dia tautkan pada dasarnya mengimplementasikan paragraf kedua saya, yaitu hanya melempar kesalahan.

David Z
sumber
1
Semua yang akan dilakukan akan menghentikan bit scripting yang sedang dijalankan. Itu tidak akan menghentikan acara baru dari penembakan dan menjalankan potongan skrip baru.
andynormancx
Belum lagi, Anda tidak perlu fungsi ekstra buruk untuk melempar kesalahan. Javascript memiliki pernyataan melempar bawaan.
Chris
Fungsi die tidak lebih dari p.blah Anda (), ia berjalan melalui peristiwa windows dan menggantikan pegangan yang mereka miliki dengan "e.preventDefault (); e.stopPropagation ();", yang akan menghentikan peristiwa penembakan. Lalu itu melempar pengecualian.
andynormancx
1

lempar "";

Merupakan penyalahgunaan konsep tetapi mungkin satu-satunya pilihan. Dan, ya, Anda harus mengatur ulang semua pendengar acara, seperti jawaban yang diterima. Anda juga akan membutuhkan satu titik masuk jika saya benar.

Di atasnya: Anda ingin halaman yang melapor kepada Anda melalui email segera setelah dilempar - Anda dapat menggunakan misalnya Raven / Sentry untuk ini. Tapi itu berarti, Anda menghasilkan sendiri kesalahan positif. Dalam kasus seperti itu, Anda juga perlu memperbarui penangan default untuk memfilter acara tersebut atau mengabaikan acara tersebut di dasbor Sentry.

window.stop ();

Ini tidak berfungsi selama pemuatan halaman. Itu berhenti decoding halaman juga. Jadi, Anda tidak dapat menggunakannya untuk menawarkan varian halaman bebas javascript kepada pengguna.

debugger;

Hentikan eksekusi hanya dengan debugger dibuka. Bekerja dengan baik, tetapi tidak bisa dikirim.

informatik-handwerk.de
sumber
1

Dalam JavaScript ada beberapa cara, di bawah ini adalah beberapa di antaranya

Metode 1:

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

Metode 2:

return;

Metode 3:

return false;

Metode 4:

new new

Metode 5:

tulis fungsi kustom Anda menggunakan metode di atas dan panggil ke tempat yang Anda butuhkan

Catatan: Jika Anda ingin menghentikan sementara eksekusi kode yang dapat Anda gunakan

debugger; 
Srikrushna
sumber
0

Fungsi kecil ini cukup mirip dengan meniru keluar PHP (). Seperti solusi lainnya, jangan tambahkan yang lain.

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

Cukup buat kondisi BOOL, tidak perlu kode rumit di sini ..

Jika bahkan sekali Anda mengubahnya menjadi true / atau multiple times, keduanya akan memberi Anda satu baris solusi / tidak multipel - pada dasarnya sesederhana itu.

moni
sumber
0

Jika Anda menggunakan fungsi yang tidak terdefinisi dalam skrip maka skrip akan berhenti karena "Uncaught ReferenceError". Saya telah mencoba dengan mengikuti kode dan dua baris pertama dieksekusi.

Saya pikir, ini adalah cara terbaik untuk menghentikan skrip. Jika ada cara lain, tolong beri komentar. Saya juga ingin tahu cara lain yang terbaik dan sederhana. BTW, saya tidak mendapatkan keluar atau mati fungsi inbuilt dalam Javascript seperti PHP untuk mengakhiri skrip. Jika ada yang tahu, tolong beri tahu saya.

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
npsingh
sumber
0

Jika Anda hanya ingin menghentikan kode lebih lanjut dari eksekusi tanpa "melempar" kesalahan apa pun, Anda dapat mengesampingkan sementara window.onerrorseperti yang ditunjukkan pada 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.");
Richie Bendall
sumber
0

Saya menggunakan iobroker dan dengan mudah berhasil menghentikan skrip

stopScript();
pengguna13449123
sumber
0

Tidak berlaku di sebagian besar keadaan, tetapi saya memiliki banyak skrip async yang berjalan di browser dan sebagai peretasan saya lakukan

window.reload();

untuk menghentikan semuanya.

M3RS
sumber
0

Saya tahu ini sudah tua, tetapi jika Anda menginginkan die()fungsi PHP yang serupa , Anda dapat melakukannya:

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

Pemakaian:

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

Contoh di atas hanya akan mencetak "Halo".

Nanoo
sumber
-1

saya menggunakan kode ini untuk menghentikan eksekusi:

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

Anda akan mendapatkan kesalahan konsol tetapi itu bekerja baik untuk saya.

John Smith
sumber
-2

Ini adalah contoh, bahwa, jika suatu kondisi ada, maka akhiri skrip. Saya menggunakan ini di javascript sisi klien SSE saya, jika

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

canot diurai langsung dari JSON parse ...

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

... pokoknya ide umumnya adalah:

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

ini akan mengakhiri / mati skrip javasript Anda

kapad
sumber
1
Ini tidak benar-benar menjawab pertanyaan. Mereka berbicara tentang masalah umum, tidak ada hubungannya dengan variabel / file SSE spesifik Anda.
mjk
1
mjk - lebih baik sekarang?
kapad
-3

saya menggunakan pernyataan return bukannya throw karena throw memberikan error pada konsol cara terbaik untuk melakukannya adalah memeriksa kondisinya

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

ini hanya menghentikan eksekusi program dari baris itu, alih-alih memberikan kesalahan di konsol.

iamsaurav
sumber
1
Namun, ini memberikan kesalahan pada linter Anda sebagai "Tidak dapat menggunakan 'kembali' di luar fungsi"
Carles Alcolea
Ini menghentikan eksekusi karena pernyataan tidak valid. Anda juga bisa menggunakan if (condition) { new new }atau if (condition) { purpleMonkeyDishwasher(); }.
Coderer