JavaScript setara dengan dadu PHP

100

Apakah ada sesuatu seperti "mati" di JavaScript? Saya sudah mencoba dengan "break", tetapi tidak berhasil :)

cupakob
sumber
"mati", seperti "goto" tidak sesuai dengan pemrograman terstruktur. Jenis instruksi ini tidak boleh digunakan untuk proyek yang serius. en.wikipedia.org/wiki/Structured_programming
Adrian Maire
3
function die(str) {throw new Error(str || "Script ended by death");}Atau sesuatu XD Banyak pilihan yang lebih baik di luar sana, tapi ini akan berhasil. Mungkin bagus untuk debugging, jika Anda hanya ingin menjalankan bagian pertama dari skrip untuk memastikannya berfungsi.
Niet the Dark Absol
@stefita Kenapa komentar anda tidak masuk ke jawaban ?? exit () adalah yang saya butuhkan. Cara lain, adalah dengan menjalankan loop panggilan otomatis, akan dijalankan sebanyak 1599 kali kemudian menghentikan eksekusi. Terima kasih.
m3nda
@AdrianMaire Hati Anda berada di tempat yang tepat, tetapi pertanyaan "mengapa" seharusnya tidak menjadi masalah. Kejahatan die, goto, eval, dll tanpa henti dimuntahkan (dan bukan tanpa jasa), tetapi mereka semua memiliki kegunaan khusus mereka, terutama untuk tingkat rendah debugging. Jika tidak, bahasa tidak akan memasukkannya. Dalam hal ini, JS setara returndan throwcukup tidak berbahaya.
Beejor

Jawaban:

34

Anda hanya dapat breakmemblokir cakupan jika Anda melabelinya. Sebagai contoh:

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

Anda tidak dapat memutus lingkup blok dari dalam fungsi dalam lingkup. Ini berarti Anda tidak dapat melakukan hal-hal seperti:

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

Anda dapat melakukan sesuatu yang serupa dengan fungsi:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}
Eli Grey
sumber
5
Saya tidak pernah tahu tentang memberi label lingkup blok apalagi menulis lingkup blok. Apakah itu berarti itu foo: {}adalah sebuah benda?
enchance
3
Tidak. Ini lingkup blok. Ini sama denganfoo: if(true){...}
Eli Gray
Apakah ada alternatif lain karena Anda tidak bisa "memecah lingkup blok dari dalam fungsi di lingkup"?
haykam
207
throw new Error("my error message");
Stephen Sorensen
sumber
7
ini benar-benar jawabannya dan berfungsi seperti die (); namun orang tidak perlu peduli dengan "1 Error" merah dari firebug!
Alexar
3
Saya rasa jika PHP memiliki padanan "firebug", ia juga harus menulis "1 error" pada die () ;-) Jawaban yang bagus!
Adrian Maire
1
Tidakkah ini akan menghasilkan kotak dialog peringatan di IE8?
sbichenko
Bukan setara 1-ke-1, karena PHP juga memiliki pengecualian yang tidak tertangkap.
Brilliand
Ini tidak akan sepenuhnya menghentikan eksekusi AFAIK, tetapi hanya sekitar lemparan. Spesifik sangat kabur tapi saya cukup yakin skrip dapat terus berjalan di tempat lain.
Rolf
22

Anda cukup menggunakan return;contoh

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

Kembali akan kembali ke fungsi pemanggil utama test1 (); dan lanjutkan dari sana ke 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>

tetapi jika Anda hanya menambahkan lemparan ''; ini akan menghentikan eksekusi sepenuhnya tanpa menyebabkan kesalahan apa pun.

<!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>

Ini diuji dengan firefox dan chrome. Saya tidak tahu bagaimana ini ditangani oleh IE atau Safari

themhz
sumber
2
Sejauh yang saya tahu, returnhanya keluar dari fungsi penutup. Ini tidak berfungsi jika Anda ingin berhenti menjalankan seluruh skrip.
André Leria
1
hmmm ya Anda benar, itu tidak menghentikan eksekusi semua script.
themhz
throw "": ... tanpa menyebabkan kesalahan ...Uncaught ""
Kurang tepat
15

Telepon saja die() tanpa pernah menjelaskannya. Skrip Anda akan macet. :)

Ketika saya melakukan ini, saya biasanya menelepon discombobulate(), tetapi prinsipnya sama.

(Sebenarnya, yang dilakukannya adalah melempar ReferenceError, membuatnya kira-kira sama dengan jawaban spudly - tetapi lebih pendek untuk diketik, untuk tujuan debugging.)

Brilliand
sumber
Penggunaan pengenal kustom yang tidak ditentukan sangat kreatif! Saya suka bagaimana dieintuitif dan ringkas. Itu tidak memiliki manfaat throwketika datang untuk mencatat pesan kesalahan tertentu, tetapi terkadang hanya nomor baris yang cukup. BTW, die;tanpa tanda kurung (un-) juga berfungsi.
Beejor
atau mati saja; di baris di mana Anda ingin javascript Anda berhenti.
MarcoZen
Jawaban ini sangat berpikiran JS ^^ Tidak kotor jika berhasil!
Yonn Trimoreau
7

Dimungkinkan untuk menggulung dadu PHP versi Anda sendiri:

function die(msg)
{
    throw msg;
}

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

test();

Contoh JSFiddle

Kelmar
sumber
Saya ingin menyebutkan bahwa ini tidak akan berhasil dalam kasus seperti ini var a = arguments[3] || die('message'). sebagai gantinya, saya pikir mati seharusnya: function die(msg) { return eval(`throw "${msg}"`);)tetapi meskipun demikian, saya pikir ini hanya harus keras ditempatkan pada baris yang terputus sehingga kesalahan menunjukkan baris mana yang gagal, misalnya this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry
Mungkin, tidak yakin eval () menyelesaikan masalah jika saya memahami Anda. Idealnya, seseorang akan melihat jejak tumpukan jika Anda tertarik pada tempat kegagalan sebenarnya terjadi. Kalau tidak, menurut saya aman untuk berasumsi bahwa Anda hanya ingin melaporkan semacam pesan dasar kegagalan untuk pengguna Anda.
Kelmar
7

Jika Anda menggunakan nodejs, Anda dapat menggunakan

process.exit(<code>);
rickbsgu.dll
sumber
4
Jika ini tentang node.js, pertanyaannya akan memiliki tag node.js
FelixSFD
3
@FelixSFD: Masih membantu saya, karena saya sedang mencari ini, benar-benar mengabaikan tag;)
DE
3

gunakan firebug dan ...

debugger;

dan jangan biarkan debugger membuat langkah apa pun ke depan. Lebih bersih dari pada melempar yang benar Error, kan?

nourdine
sumber
2
Tidak persis sama!
Rolf
2

Tidak ada persamaan yang tepat dari konstruksi bahasa diePHP dalam Javascript . diedi PHP hampir sama dengan System.exit()di Java , yang menghentikan skrip saat ini dan memanggil hook shutdown. Seperti yang disarankan beberapa pengguna; throw Errordapat digunakan dalam beberapa kasus, namun tidak pernah menjamin penghentian skrip saat ini. Selalu ada blok penanganan pengecualian yang mengelilingi throwpernyataan Anda - kecuali jika Anda memanggilnya di blok skrip paling atas, yang pada akhirnya hanya keluar dari blok skrip yang Anda jalankan.

Namun itu tidak akan mencegah blok kedua dieksekusi di sini (mencetak halo):

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

Anda bisa mencoba dengan:

return 0;

yang berfungsi jika proses berhenti.

Mohammed Yassine CHABLI
sumber
1

Tidak ada fungsi keluar yang setara dengan php die () di JS, jika Anda tidak menggunakan fungsi apa pun maka Anda dapat menggunakan return;

return;
Manu Joseph
sumber
0

Anda dapat menggunakan return false; Ini akan menghentikan skrip Anda.

Perbaikan bug
sumber
3
Mungkin hanya di tingkat atas. Die () PHP dapat dipanggil di tingkat mana pun dan akan menyebabkan penerjemah PHP langsung pergi dari sana.
Rolf
0

Ini harus bekerja seperti die ();

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

Fungsi die () global untuk tujuan pengembangan:

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

Gunakan die ():

die('Error message here');
gummiost.dll
sumber
-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
arima
sumber