JavaScript setara dengan dadu PHP


100

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



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

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

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


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.)


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


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

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?


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> 


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;

0

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


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

0

Fungsi die () global untuk tujuan pengembangan:

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

Gunakan die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.