JavaScript tương đương với chết của PHP


100

Có một cái gì đó giống như "chết" trong JavaScript? Tôi đã thử với "break", nhưng không hoạt động :)



"die", như "goto" không tuân theo lập trình có cấu trúc. Những loại hướng dẫn này không bao giờ được sử dụng cho dự án nghiêm túc. vi.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}Hoặc cái gì đó XD Rất nhiều lựa chọn tốt hơn ngoài kia, nhưng điều này sẽ hoạt động. Có thể tốt cho việc gỡ lỗi, nếu bạn chỉ muốn chạy phần đầu tiên của tập lệnh để đảm bảo nó hoạt động.
Niet the Dark Absol

@stefita Tại sao không nhận xét của bạn vào câu trả lời ?? exit () là những gì tôi cần. Cách khác, là chạy một vòng lặp tự động gọi, sẽ chạy 1599 lần sau đó dừng thực thi. Cám ơn.
m3nda

@AdrianMaire Trái tim của bạn đang ở đúng nơi, nhưng "tại sao" của một câu hỏi không nên là vấn đề. Các tệ nạn của die, goto, eval, vv không ngừng nhả ra (và không phải không có công đức), nhưng tất cả họ đều có công dụng đặc biệt của họ, đặc biệt là đối với cấp thấp gỡ lỗi. Nếu không, các ngôn ngữ sẽ không bao gồm chúng. Trong trường hợp này, JS tương đương returnthrowđủ vô hại.
Beejor

Câu trả lời:


34

Bạn chỉ có thể breakmột phạm vi khối nếu bạn gắn nhãn nó. Ví dụ:

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

Bạn không thể phá vỡ phạm vi khối từ bên trong một hàm trong phạm vi. Điều này có nghĩa là bạn không thể làm những việc như:

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

Bạn có thể làm điều gì đó tương tự với các hàm:

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

5
Tôi chưa bao giờ biết về việc gắn nhãn một phạm vi khối ít hơn nhiều viết một phạm vi khối. Nó có nghĩa foo: {}là một đối tượng?
mê hoặc

3
Không. Đó là một phạm vi khối. Nó giống nhưfoo: if(true){...}
Eli Grey

Có cách nào thay thế vì bạn không thể "phá vỡ phạm vi khối từ bên trong một hàm trong phạm vi" không?
haykam

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

7
đây hoàn toàn là câu trả lời và hoạt động giống như die (); tuy nhiên người ta không nên quan tâm đến "1 Lỗi" màu đỏ của firebug!
Alexar

3
Tôi nghĩ rằng nếu PHP có tương đương "firebug", thì nó cũng nên viết "1 error" trên die () ;-) Câu trả lời hay!
Adrian Maire

1
Điều này sẽ không tạo ra một hộp thoại cảnh báo trong IE8?
sbichenko

Không phải là tương đương 1-1, vì PHP cũng không có ngoại lệ.
Brilliand

Điều này sẽ không hoàn toàn ngừng thực hiện AFAIK, mà chỉ gần như xung quanh việc ném. Các chi tiết cụ thể rất mờ nhưng tôi khá chắc chắn rằng tập lệnh có thể tiếp tục chạy ở một nơi khác.
Rolf

22

Bạn chỉ có thể sử dụng return;ví dụ

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

Kết quả trả về sẽ trở lại hàm người gọi chính test1 (); và tiếp tục từ đó đến 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>

nhưng nếu bạn chỉ thêm ném ''; điều này sẽ dừng hoàn toàn việc thực thi mà không gây ra bất kỳ lỗi nào.

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

Điều này được thử nghiệm với firefox và chrome. Tôi không biết IE hoặc Safari xử lý vấn đề này như thế nào


2
Theo như tôi biết, returnchỉ thoát khỏi chức năng bao quanh. Nó không hoạt động khi bạn muốn ngừng thực thi toàn bộ tập lệnh.
André Leria

1
hmmm vâng, bạn nói đúng, nó không dừng việc thực thi tất cả các tập lệnh.
themhz

throw "": ... mà không gây ra bất kỳ lỗi nào ... - Không hoàn toàn ...Uncaught ""
FZs

15

Chỉ cần gọi die()mà không bao giờ xác định nó. Tập lệnh của bạn sẽ bị lỗi. :)

Khi tôi làm điều này, tôi thường gọi discombobulate()thay thế, nhưng nguyên tắc là như nhau.

(Trên thực tế, điều này làm là ném một ReferenceError, làm cho nó gần giống với câu trả lời của spudly - nhưng nó ngắn hơn để nhập, cho mục đích gỡ lỗi.)


Việc sử dụng một số nhận dạng không xác định tùy chỉnh là rất sáng tạo! Tôi thích cách dietrực quan và ngắn gọn. Nó thiếu lợi ích throwkhi ghi lại một thông báo lỗi cụ thể, nhưng đôi khi chỉ cần số dòng là đủ. BTW, die;không có dấu ngoặc đơn (un-) cũng hoạt động.
Beejor

hoặc chỉ chết; tại dòng mà bạn muốn javascript của mình dừng lại.
MarcoZen

Câu trả lời này rất hợp với JS ^^ Nó không bẩn nếu nó hoạt động!
Yonn Trimoreau

7

Có thể cuộn phiên bản chết của PHP của riêng bạn:

function die(msg)
{
    throw msg;
}

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

test();

Ví dụ về JSFiddle


Tôi muốn đề cập rằng điều này sẽ không hoạt động trong các trường hợp như var a = arguments[3] || die('message'). thay vào đó, tôi nghĩ rằng chết nên: function die(msg) { return eval(`throw "${msg}"`);)nhưng thậm chí sau đó, tôi nghĩ rằng điều này sẽ chỉ được cứng đặt trên dòng phá vỡ để các chương trình lỗi mà dòng thất bại, ví dụ this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

Có lẽ, không chắc eval () giải quyết được vấn đề nếu tôi hiểu bạn. Lý tưởng nhất là người ta sẽ xem xét dấu vết ngăn xếp nếu bạn quan tâm đến việc thất bại thực sự đang ở đâu. Nếu không, tôi sẽ nghĩ rằng sẽ an toàn nếu giả sử rằng bạn chỉ muốn báo cáo một số loại thông báo lỗi cơ bản cho người dùng của bạn.
Kelmar

7

Nếu bạn đang sử dụng nodejs, bạn có thể sử dụng

process.exit(<code>);

4
Nếu đây sẽ vào khoảng Node.js, câu hỏi sẽ có thẻ Node.js
FelixSFD

3
@FelixSFD: Nó vẫn giúp tôi, vì tôi đang tìm kiếm chính xác điều này, hoàn toàn bỏ qua các thẻ;)
DE

3

sử dụng firebug và vinh quang ...

debugger;

và không bao giờ để trình gỡ lỗi thực hiện bất kỳ bước nào. Sạch sẽ hơn ném một cái đúng Error, innit?


2
Không hoàn toàn giống nhau!
Rolf

2

Không có sự tương đương chính xác nào về cấu trúc ngôn ngữ diecủa PHP trong Javascript . dietrong PHP tương đương với System.exit()trong Java , nó kết thúc tập lệnh hiện tại và gọi các hook tắt máy. Như một số người dùng đã đề xuất; throw Errorcó thể được sử dụng trong một số trường hợp, tuy nhiên nó không bao giờ đảm bảo việc chấm dứt tập lệnh hiện tại. Luôn có thể có một khối xử lý ngoại lệ xung quanh throwcâu lệnh của bạn - trừ khi bạn gọi nó trên khối tập lệnh cấp cao nhất, khối này cuối cùng chỉ thoát khỏi khối tập lệnh mà bạn đang thực thi.

Tuy nhiên, nó sẽ không ngăn khối thứ hai được thực thi ở đây (in lời chào):

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


1

Không có lối thoát hàm nào tương đương với php die () trong JS, nếu bạn không sử dụng bất kỳ hàm nào thì bạn có thể chỉ cần sử dụng return;

return;

0

Bạn có thể sử dụng return false; Điều này sẽ chấm dứt tập lệnh của bạn.


3
Có lẽ chỉ ở cấp cao nhất. Die () của PHP có thể được gọi ở bất kỳ mức nào và sẽ khiến trình thông dịch PHP chạy ngay tại đó.
Rolf

0

Điều này nên làm việc như die ();

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

0

Hàm die () toàn cục cho các mục đích phát triển:

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

Sử dụng die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.