Jak zakończyć skrypt w JavaScript?

149

Jak mogę wyjść ze skryptu JavaScript, podobnie jak PHP exitlub die? Wiem, że to nie jest najlepsza praktyka programistyczna, ale muszę.

Nir
źródło
1
Czy myślisz, że mógłbyś rozszerzyć ten wymóg, dlaczego dokładnie próbujesz to osiągnąć?
andynormancx
8
@andynormancx, może to być przydatne do debugowania.
USTAW
3
po prostu return;może wystarczyć w zależności od Twoich wymagań, działa jak die () bez parametrów.
Ishikawa
2
Jeśli tego „potrzebujesz”, lepiej przemyśleć swój projekt.
Frungi
18
dlaczego zawsze pierwsze pytanie brzmi „dlaczego”?
john ktejik

Odpowiedzi:

80

Odpowiednik JavaScript dla PHPdie . BTW to po prostu dzwoni exit()(dzięki 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
źródło
1
Oto kod źródłowy wyjścia: kevin.vanzonneveld.net/techblog/article/…
splattne
Wygląda na to, że kod nie zatrzymuje uruchamiania zdarzeń w elementach, tylko zdarzenia okna. Więc musiałbyś również przejrzeć wszystkie elementy na stronie, robiąc coś podobnego. To wszystko brzmi jednak jak bardzo dziwny wymóg.
andynormancx
2
cała koncepcja matrycy jest nieco zepsuta - przepływ powinien być w stanie obsłużyć wszelkie ewentualności, niezależnie od tego, czy wymaga to próbowania, czy nie.
annakata
Myślę, że nie uwzględniono wszystkich zdarzeń, które powinny być obsługiwane, takich jak zdarzenie „selectstart”.
Ono Oogami
4
Nie możesz zatrzymać obsługi XMLHttpRequest. Bieżący kod nie zatrzymuje wykonywania interwałów ani limitów czasu. Demo: jsfiddle.net/skibulk/wdxrtvus/1 Możesz to potraktować jako poprawkę: stackoverflow.com/a/8860203/6465140
skibulk
73

Funkcje „wyjścia” zazwyczaj kończą działanie programu lub skryptu wraz z komunikatem o błędzie jako parametrem. Na przykład die (...) w php

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

Odpowiednikiem w JS jest zasygnalizowanie błędu słowem kluczowym throw w następujący sposób:

throw new Error();

Możesz to łatwo przetestować:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
źródło
46
@Sydwell: Jeśli otoczysz go blokiem catch, zostanie przechwycony, a program nie zakończy działania, przeciwstawiając się temu sensowi.
ostateczny
4
Nie zapominaj, że możesz dodać wiadomość do błędu: throw new Error ('variable =' + x); To dobry sposób na szybkie zakończenie skryptu podczas pracy nad nim i uzyskanie wartości zmiennej.
Andrew Swift,
1
@ultimate Myślę, że #Sydwell oznacza zawinięcie całego skryptu w try / catch, dzięki czemu można uzyskać a) czyste wyjście b) komunikat o możliwym wyjątku w razie potrzeby :) Rzucanie niepotrzebnych wyjątków generalnie nie przynosi nic dobrego :)
jave.web
47

Nawet w prostych programach bez uchwytów, zdarzeń itp., Najlepiej jest umieścić kod w funkcji „głównej”, nawet jeśli jest to jedyna procedura:

<script> 
function main()
{
//code

}
main();
</script>

W ten sposób, gdy chcesz zatrzymać program, możesz użyć „powrotu”.

Jhep
źródło
15

Jeśli nie obchodzi Cię, że to błąd, po prostu napisz:

fail;

To zatrzyma kontynuację twojego głównego (globalnego) kodu. Przydatne w niektórych aspektach debugowania / testowania.

Marc
źródło
1
window.failnie jest zdefiniowany w obecnych przeglądarkach.
mikemaccana
7
W tym rzecz - możesz też zrobić mikeyMouse;- błąd zniknie. Jest szybki i brudny.
Marc
1
Ach, w porządku - może dodać to do swojej odpowiedzi?
mikemaccana
13

Istnieje wiele sposobów na wyjście ze skryptu JS lub Node. Oto najważniejsze:

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

Jeśli jesteś w REPL (tj. Po uruchomieniu nodew wierszu poleceń), możesz napisać, .exitaby zakończyć.

not2qubit
źródło
Nie chciałem obrażać inteligencji czytelników, wyjaśniając akronim, który pojawia się jako pierwszy wynik wyszukiwania w Google. Sugeruję, aby nie mieszać kodu JavaScript z poleceniami REPL, ponieważ jeśli użytkownik skopiuje / wklei ten blok kodu i uruchomi go, otrzyma błąd składni w wierszu „.exit”.
Dan Dascalescu
6

W moim przypadku użyłem window.stopAPI, które przypomina kliknięcie przycisku X w Twojej przeglądarce:

window.stop();
Musa
źródło
5

Umieść debugger;słowo kluczowe w kodzie JavaScript, w którym chcesz zatrzymać wykonywanie. Następnie otwórz narzędzia programistyczne swojej ulubionej przeglądarki i ponownie załaduj stronę. Teraz powinno się automatycznie zatrzymać. Otwórz sekcję Źródła w swoich narzędziach: debugger;słowo kluczowe jest podświetlone i masz możliwość wznowienia wykonywania skryptu.

Mam nadzieję, że to pomoże.

Więcej informacji na:

rponiżej
źródło
2

Myślę, że odpowiedź na to pytanie została udzielona, ​​kliknij tutaj, aby uzyskać więcej informacji. Poniżej znajduje się krótka odpowiedź, którą opublikowano.

throw new Error("Stop script");

Możesz także użyć przeglądarki, aby dodać punkty przerwania, każda przeglądarka jest podobna, sprawdź informacje poniżej dla swojej przeglądarki.

Informacje o punktach przerwania przeglądarki Chrome kliknij tutaj Informacje o
punktach przerwania przeglądarki Firefox kliknij tutaj
W przypadku informacji o punktach przerwania przeglądarki Explorer kliknij opcję Informacje o punktach przerwania przeglądarki
Safari kliknij tutaj

alfmonc
źródło
1

Jeśli szukasz sposobu na wymuszenie zakończenia wykonywania całego kodu JavaScript na stronie, nie jestem pewien, czy istnieje oficjalnie usankcjonowany sposób, aby to zrobić - wydaje się, że jest to coś, co może stanowić zagrożenie bezpieczeństwa (chociaż szczerze mówiąc, nie mogę sobie wyobrazić, jak by to było poza moją głową). Zwykle w JavaScript, gdy chcesz, aby kod przestał działać, po prostu returnwykonujesz dowolną funkcję. ( returnInstrukcja jest opcjonalna, jeśli jest ostatnią rzeczą w funkcji, a funkcja nie powinna zwracać wartości) Jeśli istnieje jakiś powód, dla którego zwrot nie jest wystarczająco dobry, prawdopodobnie powinieneś edytować więcej szczegółów w pytaniu, dlaczego myślisz potrzebujesz tego i być może ktoś zaoferuje alternatywne rozwiązanie.

Należy zauważyć, że w praktyce większość interpreterów JavaScript w przeglądarkach po prostu przestaje uruchamiać bieżący skrypt, jeśli napotka błąd. Możesz więc zrobić coś takiego, jak uzyskanie dostępu do atrybutu nieustawionej zmiennej:

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

i prawdopodobnie przerwie skrypt. Ale nie powinieneś na to liczyć, ponieważ nie jest to wcale standardowe i naprawdę wydaje się okropną praktyką.

EDYCJA : OK, może to nie była taka dobra odpowiedź w świetle Ólafura. Chociaż die()funkcja, z którą się łączył, w zasadzie implementuje mój drugi akapit, tj. Po prostu zgłasza błąd.

David Z
źródło
1
Wszystko to spowoduje zatrzymanie bieżącego wykonywania skryptu. Nie powstrzyma to nowych zdarzeń przed uruchomieniem i uruchomieniem nowych fragmentów skryptu.
andynormancx
Nie wspominając o tym, że nie potrzebujesz dodatkowej złej funkcji, aby zgłosić błąd. JavaScript ma wbudowaną instrukcję throw.
Chris
Funkcja die robi o wiele więcej niż twoja p.blah (), przechodzi przez zdarzenia Windows i zastępuje uchwyty, które mają przez "e.preventDefault (); e.stopPropagation ();", co zatrzyma uruchamianie zdarzeń. Następnie zgłasza wyjątek.
andynormancx
1

rzucać "";

Jest to nadużycie koncepcji, ale prawdopodobnie jedyna opcja. I tak, będziesz musiał zresetować wszystkie odbiorniki zdarzeń, tak jak wspomina zaakceptowana odpowiedź. Jeśli mam rację, potrzebowałbyś również jednego punktu wejścia.

A do tego: chcesz mieć stronę, która raportuje do ciebie e-mailem, gdy tylko się pojawi - możesz użyć do tego na przykład Raven / Sentry. Ale to oznacza, że ​​produkujesz fałszywe alarmy. W takim przypadku musisz również zaktualizować domyślną procedurę obsługi, aby odfiltrować takie zdarzenia lub ustawić takie zdarzenia na ignoruj ​​na pulpicie nawigacyjnym Sentry.

window.stop ();

To nie działa podczas ładowania strony. Zatrzymuje również dekodowanie strony. Więc tak naprawdę nie możesz go użyć, aby zaoferować użytkownikowi wariant swojej strony wolny od javascript.

debugger;

Zatrzymuje wykonywanie tylko przy otwartym debugerze. Działa świetnie, ale nie jest to element dostarczalny.

informatik-handwerk.de
źródło
1

W JavaScript istnieje wiele sposobów, poniżej znajduje się kilka z nich

Metoda 1:

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

Metoda 2:

return;

Metoda 3:

return false;

Metoda 4:

new new

Metoda 5:

napisz swoją funkcję niestandardową użyj powyższej metody i zadzwoń tam, gdzie potrzebujesz

Uwaga: Jeśli chcesz po prostu wstrzymać wykonywanie kodu, możesz użyć

debugger; 
Srikrushna
źródło
0

Ta mała funkcja jest bardzo bliska naśladowaniu wyjścia PHP (). Podobnie jak w przypadku innych rozwiązań, nie dodawaj niczego więcej.

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit
David Spector
źródło
0

Po prostu utwórz warunek BOOL, nie ma potrzeby stosowania tutaj skomplikowanego kodu.

Jeśli nawet raz zmienisz to na prawdę / lub wiele razy, obie dadzą ci jedną linię rozwiązania / nie wielokrotność - w zasadzie proste.

moni
źródło
0

Jeśli użyjesz jakiejkolwiek niezdefiniowanej funkcji w skrypcie, skrypt zatrzyma się z powodu „Uncaught ReferenceError”. Próbowałem postępując zgodnie z kodem i wykonując pierwsze dwie linie.

Myślę, że to najlepszy sposób na zatrzymanie scenariusza. Jeśli istnieje inny sposób, to proszę o komentarz. Chcę też poznać inny najlepszy i prosty sposób. BTW, nie dostałem wyjścia ani nie umarłem wbudowanej funkcji w JavaScript, takiej jak PHP, do zakończenia skryptu. Jeśli ktoś wie, daj mi znać.

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
npsingh
źródło
0

Jeśli chcesz po prostu zatrzymać wykonywanie dalszego kodu bez „zgłaszania” jakiegokolwiek błędu, możesz tymczasowo nadpisać, window.onerrorjak pokazano na 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
źródło
0

Używam iobrokera i łatwo udało mi się zatrzymać skrypt za pomocą

stopScript();
user13449123
źródło
0

W większości przypadków nie dotyczy, ale miałem wiele skryptów asynchronicznych uruchomionych w przeglądarce i jako hack to robię

window.reload();

zatrzymać wszystko.

M3RS
źródło
0

Wiem, że to jest stare, ale jeśli chcesz mieć podobną die()funkcję PHP , możesz zrobić:

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

Stosowanie:

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

Powyższy przykład wypisze tylko „Hello”.

Nanoo
źródło
-1

używam tego fragmentu kodu, aby zatrzymać wykonywanie:

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

pojawi się błąd konsoli, ale to działa dobrze dla mnie.

John Smith
źródło
-2

Jest to przykład, że jeśli exist stan, a następnie zakończyć skrypt. Używam tego w moim javascript po stronie klienta SSE, jeśli

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

nie można przeanalizować bezpośrednio z analizy JSON ...

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

... w każdym razie ogólna idea jest taka:

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

spowoduje to zakończenie / śmierć skryptu javasript

kapad
źródło
1
To naprawdę nie odpowiada na pytanie. Mówią o ogólnym problemie, nie ma nic wspólnego z twoimi określonymi zmiennymi / plikiem SSE.
mjk
1
mjk - teraz lepiej?
kapad
-3

używam instrukcji return zamiast throw, ponieważ throw powoduje błąd w konsoli. najlepszym sposobem jest sprawdzenie stanu

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

to po prostu zatrzymuje wykonywanie programu z tej linii, zamiast wyświetlać błędy w konsoli.

iamsaurav
źródło
1
Jednak wyświetla błąd w lintersach jako „Nie można użyć 'powrotu' poza funkcją”
Carles Alcolea
Zatrzymuje wykonywanie, ponieważ instrukcja jest nieprawidłowa. Możesz również użyć if (condition) { new new }lub if (condition) { purpleMonkeyDishwasher(); }.
Coderer