Làm cách nào để chấm dứt tập lệnh trong JavaScript?


149

Làm cách nào tôi có thể thoát khỏi tập lệnh JavaScript giống như của PHP exithoặc die? Tôi biết đó không phải là thực hành lập trình tốt nhất nhưng tôi cần.


1
Bạn có nghĩ rằng bạn có thể mở rộng theo yêu cầu này, chính xác tại sao bạn đang cố gắng để đạt được điều này?
andynormancx

8
@andynormancx, điều này có thể hữu ích để gỡ lỗi.
TẬP

3
chỉ return;có thể là đủ tùy thuộc vào yêu cầu của bạn, hoạt động như die () không có tham số.
Ishikawa

2
Nếu bạn cần một người khác, bạn có thể nên suy nghĩ lại về thiết kế của mình.
Frungi

18
Tại sao luôn là câu hỏi đầu tiên "tại sao"?
john ktejik

Câu trả lời:


80

JavaScript tương đương với PHPdie . BTW nó chỉ gọi exit()(cảm ơn 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
Đây là mã nguồn của lối ra: kevin.vanzonneveld.net/techblog/article/iêu
splattne

Mã đó dường như không ngăn các sự kiện trên các phần tử bắn, chỉ các sự kiện của cửa sổ. Vì vậy, bạn cũng cần phải lặp qua tất cả các yếu tố trên trang để làm điều gì đó tương tự. Tất cả nghe có vẻ như là một yêu cầu rất kỳ quặc.
andynormancx

2
toàn bộ khái niệm die là một chút bị hỏng - dòng chảy sẽ có khả năng xử lý bất kỳ và tất cả các tình huống, cho dù đó có yêu cầu thử bắt hay không.
annakata

Tôi nghĩ rằng bạn không bao gồm tất cả các sự kiện nên được xử lý, chẳng hạn như sự kiện "chọn bắt đầu".
Ono Oogami

4
Bạn không thể dừng trình xử lý XMLHttpRequest. Mã hiện tại không dừng khoảng thời gian hoặc thời gian chờ thực thi. Bản demo: jsfiddle.net/skibulk/wdxrtvus/1 Bạn có thể coi đây là bản sửa lỗi: stackoverflow.com/a/8860203/6465140
skibulk

73

Các chức năng "thoát" thường thoát khỏi chương trình hoặc tập lệnh cùng với thông báo lỗi là tối ưu. Ví dụ: die (...) trong php

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

Tương đương trong JS là báo hiệu lỗi với từ khóa throw như thế này:

throw new Error();

Bạn có thể dễ dàng kiểm tra điều này:

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

x
>>>undefined
m
>>>100

46
@Sydwell: Nếu bạn bao quanh nó bằng khối bắt, nó sẽ bị bắt và chương trình sẽ không chấm dứt, bất chấp quan điểm ở đây.
cuối cùng

4
Đừng quên rằng bạn có thể thêm một thông báo vào lỗi: ném Lỗi mới ('biến =' + x); Đó là một cách hay để nhanh chóng kết thúc một tập lệnh trong khi bạn đang làm việc với nó và nhận giá trị của một biến.
Andrew Swift

1
@ultimate Tôi nghĩ rằng #Sydwell có ý định bao bọc toàn bộ tập lệnh trong thử / bắt, do đó bạn có thể nhận được một) lối thoát sạch b) thông báo ngoại lệ có thể khi cần :) Ném ngoại lệ không suy nghĩ thường không mang lại kết quả tốt :)
jave.web

47

Ngay cả trong các chương trình đơn giản không có tay cầm, sự kiện và như vậy, tốt nhất là đặt mã trong hàm "chính", ngay cả khi đó là thủ tục duy nhất:

<script> 
function main()
{
//code

}
main();
</script>

Bằng cách này, khi bạn muốn dừng chương trình, bạn có thể sử dụng "return".


15

Nếu bạn không quan tâm rằng đó là một lỗi, chỉ cần viết:

fail;

Điều đó sẽ ngăn mã chính (toàn cầu) của bạn tiếp tục. Hữu ích cho một số khía cạnh của gỡ lỗi / thử nghiệm.


1
window.failkhông được xác định trong các trình duyệt hiện tại.
mikemaccana

7
Đó là điểm - bạn cũng có thể làm mikeyMouse;- lỗi sẽ chấm dứt. Nó nhanh và bẩn.
Marc

1
Ah đủ công bằng - có thể thêm điều đó vào câu trả lời của bạn?
mikemaccana

13

nhiều cách để thoát khỏi tập lệnh JS hoặc Node. Dưới đây là những gì có liên quan nhất:

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

Nếu bạn đang ở REPL (tức là sau khi chạy nodetrên dòng lệnh), bạn có thể nhập .exitđể thoát.


Tôi không muốn xúc phạm trí thông minh của độc giả bằng cách giải thích một từ viết tắt xuất hiện như là kết quả đầu tiên của việc Googling nó. Tôi khuyên bạn không nên trộn mã JavaScript với các lệnh REPL bởi vì nếu người dùng sao chép / dán khối mã đó và chạy nó, họ sẽ gặp lỗi Cú pháp trên dòng ".exit".
Dan Dascalescu

6

Trong trường hợp của tôi, tôi đã sử dụng window.stopAPI giống như nhấp vào nút X trên trình duyệt của bạn:

window.stop();

5

Đặt debugger;từ khóa vào mã JavaScript của bạn nơi bạn muốn dừng thực thi. Sau đó mở các công cụ phát triển trình duyệt yêu thích của bạn và tải lại trang. Bây giờ nó sẽ tạm dừng tự động. Mở phần Nguồn của các công cụ của bạn: debugger;từ khóa được tô sáng và bạn có tùy chọn để tiếp tục thực thi tập lệnh.

Tôi hy vọng nó sẽ giúp.

Biết thêm thông tin tại:


2

Tôi nghĩ rằng câu hỏi này đã được trả lời, bấm vào đây để biết thêm thông tin. Dưới đây là câu trả lời ngắn gọn được đăng.

throw new Error("Stop script");

Bạn cũng có thể sử dụng trình duyệt của mình để thêm điểm dừng, mọi trình duyệt đều tương tự nhau, kiểm tra thông tin bên dưới cho trình duyệt của bạn.

Đối với Chrome thông tin điểm break bấm đây
cho Firefox thông tin điểm break bấm đây
cho Explorer thông tin điểm break nhấp chuột
cho Safari thông tin điểm break nhấp chuột ở đây


1

Nếu bạn đang tìm cách chấm dứt cưỡng chế thực thi tất cả Javascript trên một trang, tôi không chắc chắn có một cách chính thức bị xử phạt để làm điều đó - có vẻ như đó là một điều có thể là rủi ro bảo mật (mặc dù vậy thành thật mà nói, tôi không thể nghĩ làm thế nào nó sẽ ra khỏi đỉnh đầu của tôi). Thông thường trong Javascript khi bạn muốn mã của mình ngừng chạy, bạn chỉ cần returnthực hiện bất kỳ chức năng nào. (Cácreturn lệnh là tùy chọn nếu đó là điều cuối cùng trong hàm và hàm không nên trả về giá trị) Nếu có lý do nào đó trả về không đủ tốt cho bạn, có lẽ bạn nên chỉnh sửa chi tiết hơn vào câu hỏi về lý do tại sao bạn nghĩ bạn cần nó và có lẽ ai đó có thể cung cấp một giải pháp thay thế.

Lưu ý rằng trong thực tế, hầu hết các trình thông dịch Javascript của trình duyệt sẽ chỉ dừng chạy tập lệnh hiện tại nếu chúng gặp lỗi. Vì vậy, bạn có thể làm một cái gì đó như truy cập một thuộc tính của một biến unset:

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

và nó có thể sẽ hủy bỏ kịch bản. Nhưng bạn không nên tin vào điều đó bởi vì nó hoàn toàn không phải là tiêu chuẩn, và nó thực sự có vẻ như là một thực tế khủng khiếp.

EDIT : OK, có lẽ đây không phải là một câu trả lời hay trong ánh sáng của Ólafur. Mặc dù die()chức năng mà anh ta liên kết đến về cơ bản thực hiện đoạn thứ hai của tôi, tức là nó chỉ gây ra lỗi.


1
Tất cả những gì sẽ làm sẽ dừng bit thực thi hiện tại. Nó sẽ không ngăn các sự kiện mới bắn và chạy các đoạn script mới.
andynormancx

Chưa kể, bạn không cần thêm một chức năng xấu để đưa ra lỗi. Javascript có một tuyên bố ném tích hợp.
Chris

Hàm die thực hiện nhiều hơn p.blah () của bạn, nó chạy qua các sự kiện windows và thay thế các tay cầm mà chúng có bằng "e.preventDefault (); e.stopPropagation ();", sẽ dừng các sự kiện bắn. Sau đó, nó ném một ngoại lệ.
andynormancx

1

phi "";

Là một lạm dụng của khái niệm nhưng có lẽ là lựa chọn duy nhất. Và, vâng, bạn sẽ phải đặt lại tất cả những người nghe sự kiện, giống như đề cập câu trả lời được chấp nhận. Bạn cũng sẽ cần một điểm vào nếu tôi đúng.

Trên đầu trang: Bạn muốn có một trang báo cáo cho bạn qua email ngay khi nó ném - bạn có thể sử dụng ví dụ Raven / Sentry cho việc này. Nhưng điều đó có nghĩa là, bạn tự sản xuất dương tính giả. Trong trường hợp như vậy, bạn cũng cần cập nhật trình xử lý mặc định để lọc các sự kiện đó hoặc bỏ qua các sự kiện đó trên bảng điều khiển của Sentry.

cửa sổ.stop ();

Điều này không hoạt động trong quá trình tải trang. Nó cũng ngừng giải mã trang. Vì vậy, bạn không thể thực sự sử dụng nó để cung cấp cho người dùng một biến thể không có javascript của trang của bạn.

trình gỡ lỗi;

Dừng thực thi chỉ với trình gỡ lỗi đã mở. Hoạt động tuyệt vời, nhưng không phải là một giao hàng.


1

Trong JavaScript có nhiều cách, bên dưới là một số trong số họ

Cách 1:

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

Cách 2:

return;

Cách 3:

return false;

Cách 4:

new new

Phương pháp 5:

viết hàm tùy chỉnh của bạn sử dụng phương thức trên và gọi nơi bạn cần

Lưu ý: Nếu bạn muốn tạm dừng việc thực thi mã, bạn có thể sử dụng

debugger; 

0

Hàm nhỏ này khá gần với việc bắt chước lối ra của PHP (). Cũng như các giải pháp khác, đừng thêm bất cứ điều gì khác.

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

0

Đơn giản chỉ cần tạo một điều kiện BOOL, không cần mã phức tạp ở đây ..

Nếu thậm chí một khi bạn biến nó thành đúng / hoặc nhiều lần, cả hai sẽ cung cấp cho bạn một dòng giải pháp / không nhiều - về cơ bản là đơn giản.


0

Nếu bạn sử dụng bất kỳ chức năng không xác định nào trong tập lệnh thì tập lệnh sẽ dừng do "Uncaught ReferenceError". Tôi đã thử bằng cách làm theo mã và hai dòng đầu tiên được thực thi.

Tôi nghĩ rằng, đây là cách tốt nhất để ngăn chặn kịch bản. Nếu có cách nào khác thì xin hãy bình luận cho tôi. Tôi cũng muốn biết một cách tốt nhất và đơn giản nhất. BTW, tôi đã không nhận được chức năng thoát hoặc chết trong Javascript như PHP để chấm dứt tập lệnh. Nếu ai biết thì làm ơn cho tôi biết.

alert('Hello');

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

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

alert('bye');

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

0

Nếu bạn chỉ muốn ngăn không cho mã tiếp tục thực thi mà không "ném" bất kỳ lỗi nào, bạn có thể tạm thời ghi đè window.onerrornhư trong 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

Không áp dụng trong hầu hết các trường hợp, nhưng tôi có rất nhiều tập lệnh async đang chạy trong trình duyệt và như một bản hack tôi làm

window.reload();

để ngăn chặn mọi thứ


0

Tôi biết điều này đã cũ, nhưng nếu bạn muốn một die()hàm PHP tương tự , bạn có thể làm:

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

Sử dụng:

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

Ví dụ trên sẽ chỉ in "Xin chào".


-1

tôi sử dụng đoạn mã này để dừng thực thi:

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

bạn sẽ gặp lỗi console nhưng nó hoạt động tốt với tôi.


-2

Đây là một ví dụ, nếu một điều kiện tồn tại, thì chấm dứt tập lệnh. Tôi sử dụng điều này trong javascript phía máy khách SSE của tôi, nếu

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

không thể phân tích cú pháp ngay từ phân tích JSON ...

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

... dù sao thì ý tưởng chung là:

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

điều này sẽ chấm dứt / chết tập lệnh javasript của bạn


1
Điều này không thực sự trả lời câu hỏi. Họ đang nói về một vấn đề chung, không liên quan gì đến các biến / tệp SSE cụ thể của bạn.
mjk

1
mjk - tốt hơn bây giờ?
kapad

-3

tôi sử dụng câu lệnh return thay vì throw as throw đưa ra lỗi trong console. cách tốt nhất để làm điều đó là kiểm tra tình trạng

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

điều này chỉ đơn giản là dừng việc thực thi chương trình từ dòng đó, thay vì đưa ra bất kỳ lỗi nào trong bảng điều khiển.


1
Tuy nhiên, nó đưa ra lỗi trong các lint của bạn là "Không thể sử dụng 'return' bên ngoài chức năng"
Carles Alcolea

Nó dừng thực thi vì câu lệnh không hợp lệ. Bạn cũng có thể sử dụng if (condition) { new new }hoặc if (condition) { purpleMonkeyDishwasher(); }.
Bộ giải mã
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.