Wie beende ich das Skript in JavaScript?

149

Wie kann ich das JavaScript-Skript ähnlich wie PHPs exitoder beenden die? Ich weiß, dass es nicht die beste Programmierpraxis ist, aber ich muss.

Nir
quelle
1
Denken Sie, Sie könnten diese Anforderung erweitern, genau warum versuchen Sie dies zu erreichen?
Andynormancx
8
@andynormancx, dies kann zum Debuggen nützlich sein.
SET
3
nur return;vielleicht genug werden je nach Ihren Anforderungen, verhält sich wie die () ohne Parameter.
Ishikawa
2
Wenn Sie es "brauchen", ist es möglicherweise besser, Ihr Design zu überdenken.
Frungi
18
warum ist immer die erste frage 'warum'?
John Ktejik

Antworten:

80

JavaScript-Äquivalent für PHPsdie . exit()Übrigens ruft es nur an (danke 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
quelle
1
Hier ist der Quellcode des Exits
splattne
Dieser Code scheint nicht zu verhindern, dass Ereignisse auf Elementen ausgelöst werden, sondern nur die Ereignisse des Fensters. Sie müssten also auch alle Elemente auf der Seite durchlaufen, um etwas Ähnliches zu tun. Es klingt alles nach einer sehr merkwürdigen Anforderung.
Andynormancx
2
Das gesamte Würfelkonzept ist ein bisschen kaputt - der Fluss sollte in der Lage sein, alle Eventualitäten zu bewältigen, unabhängig davon, ob dies einen Versuch erfordert oder nicht.
Annakata
Ich denke, Sie haben nicht alle Ereignisse eingeschlossen, die behandelt werden sollten, wie z. B. das Ereignis "selectstart".
Ono Oogami
4
Sie können XMLHttpRequest-Handler nicht stoppen. Der aktuelle Code verhindert nicht die Ausführung von Intervallen oder Zeitüberschreitungen. Demo: jsfiddle.net/skibulk/wdxrtvus/1 Sie könnten dies als Fix betrachten: stackoverflow.com/a/8860203/6465140
Skibulk
73

"exit" -Funktionen beenden normalerweise das Programm oder Skript zusammen mit einer Fehlermeldung als Parameter. Zum Beispiel sterben (...) in PHP

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

Das Äquivalent in JS besteht darin, einen Fehler mit dem Schlüsselwort throw wie folgt zu signalisieren :

throw new Error();

Sie können dies leicht testen:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
quelle
46
@Sydwell: Wenn Sie es mit einem Catch-Block umgeben, wird es abgefangen und das Programm wird nicht beendet, was dem Punkt hier trotzt.
ultimative
4
Vergessen Sie nicht, dass Sie dem Fehler eine Nachricht hinzufügen können: werfen Sie einen neuen Fehler ('variable =' + x); Es ist eine gute Möglichkeit, ein Skript schnell zu beenden, während Sie daran arbeiten, und den Wert einer Variablen abzurufen.
Andrew Swift
1
@ultimate Ich denke, dass #Sydwell ment, um das gesamte Skript in try / catch zu verpacken, damit Sie a) sauberes Beenden b) mögliche Ausnahmemeldung bei Bedarf erhalten können :) Das Auslösen nicht gekaufter Ausnahmen bringt im Allgemeinen nichts Gutes :)
jave.web
47

Selbst in einfachen Programmen ohne Handles, Ereignisse und dergleichen ist es am besten, Code in eine "Haupt" -Funktion einzufügen, selbst wenn dies die einzige Prozedur ist:

<script> 
function main()
{
//code

}
main();
</script>

Auf diese Weise können Sie "return" verwenden, wenn Sie das Programm stoppen möchten.

Jhep
quelle
15

Wenn es Ihnen egal ist, dass es sich um einen Fehler handelt, schreiben Sie einfach:

fail;

Dadurch wird verhindert, dass Ihr Hauptcode (global) fortfährt. Nützlich für einige Aspekte des Debuggens / Testens.

Marc
quelle
1
window.failist in aktuellen Browsern nicht definiert.
Mikemaccana
7
Das ist der Punkt - Sie könnten es auch tun mikeyMouse;- der Fehler wird beendet. Es ist schnell und schmutzig.
Marc
1
Ah fair genug - vielleicht fügen Sie das Ihrer Antwort hinzu?
Mikemaccana
13

Es gibt viele Möglichkeiten , ein JS- oder Node-Skript zu beenden. Hier sind die relevantesten:

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

Wenn Sie sich in der REPL befinden (dh nachdem Sie in nodeder Befehlszeile ausgeführt wurden), können Sie .exitzum Beenden Folgendes eingeben .

not2qubit
quelle
Ich wollte die Intelligenz der Leser nicht beleidigen, indem ich ein Akronym erklärte, das als erstes Ergebnis des Googelns auftaucht. Ich schlage vor, dass Sie keinen JavaScript-Code mit REPL-Befehlen mischen, da ein Benutzer, der diesen Codeblock kopiert / einfügt und ausführt, einen Syntaxfehler in der Zeile ".exit" erhält.
Dan Dascalescu
6

In meinem Fall habe ich die window.stopAPI verwendet, die dem Klicken auf die X-Schaltfläche in Ihrem Browser entspricht:

window.stop();
Musa
quelle
5

Platzieren Sie das debugger;Schlüsselwort in Ihrem JavaScript-Code, wo Sie die Ausführung stoppen möchten. Öffnen Sie dann die Entwicklertools Ihres bevorzugten Browsers und laden Sie die Seite neu. Jetzt sollte es automatisch pausieren. Öffnen Sie den Abschnitt Quellen Ihrer Tools: Das debugger;Schlüsselwort wird hervorgehoben und Sie haben die Möglichkeit, die Skriptausführung fortzusetzen.

Ich hoffe, es hilft.

Mehr Informationen bei:

unten
quelle
2

Ich denke, diese Frage wurde beantwortet. Klicken Sie hier, um weitere Informationen zu erhalten. Unten ist die kurze Antwort, die es veröffentlicht wird.

throw new Error("Stop script");

Sie können auch Ihren Browser verwenden, um Haltepunkte hinzuzufügen. Jeder Browser ist ähnlich. Überprüfen Sie die Informationen unten für Ihren Browser.

Für Informationen zu Chrome-Haltepunkten klicken Sie hier.
Für Informationen zu Firefox-Haltepunkten klicken Sie hier.
Für Informationen zu Explorer-Haltepunkten klicken Sie hier. Für Informationen zu
Safari-Haltepunkten klicken Sie hier

alfmonc
quelle
1

Wenn Sie nach einer Möglichkeit suchen, die Ausführung von Javascript auf einer Seite zwangsweise zu beenden, bin ich mir nicht sicher, ob es einen offiziell genehmigten Weg gibt, dies zu tun - es scheint die Art von Dingen zu sein, die ein Sicherheitsrisiko darstellen könnten (obwohl dies der Fall ist) Um ehrlich zu sein, ich kann mir nicht vorstellen, wie es auf meinem Kopf wäre. Wenn Sie in Javascript möchten, dass Ihr Code nicht mehr ausgeführt wird, können Sie normalerweise nur die returnFunktion ausführen , die gerade ausgeführt wird. (Die returnAnweisung ist optional, wenn es das Letzte in der Funktion ist und die Funktion keinen Wert zurückgeben sollte.) Wenn es einen Grund gibt, warum die Rückgabe für Sie nicht gut genug ist, sollten Sie wahrscheinlich die Frage, warum Sie denken, detaillierter bearbeiten Sie brauchen es und vielleicht kann jemand eine alternative Lösung anbieten.

Beachten Sie, dass in der Praxis die Javascript-Interpreter der meisten Browser das aktuelle Skript einfach nicht mehr ausführen, wenn ein Fehler auftritt. Sie können also beispielsweise auf ein Attribut einer nicht festgelegten Variablen zugreifen:

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

und es wird wahrscheinlich das Skript abbrechen. Aber darauf sollten Sie nicht zählen, weil es überhaupt nicht Standard ist und es wirklich wie eine schreckliche Praxis scheint.

EDIT : OK, vielleicht war dies angesichts von Ólafur keine so gute Antwort. Obwohl die die()Funktion, mit der er verknüpft ist, im Grunde meinen zweiten Absatz implementiert, gibt sie nur einen Fehler aus.

David Z.
quelle
1
Alles, was dazu führt, stoppt das aktuell ausgeführte Skript. Es wird nicht verhindern, dass neue Ereignisse ausgelöst und neue Skriptbits ausgeführt werden.
Andynormancx
Ganz zu schweigen davon, dass Sie keine besonders schlechte Funktion benötigen, um einen Fehler auszulösen. Javascript hat eine eingebaute throw-Anweisung.
Chris
Die Die-Funktion leistet viel mehr als Ihre p.blah (), sie läuft durch die Windows-Ereignisse und ersetzt die Handles durch "e.preventDefault (); e.stopPropagation ();", wodurch das Auslösen der Ereignisse gestoppt wird. Dann wird eine Ausnahme ausgelöst.
Andynormancx
1

werfen "";

Ist ein Missbrauch des Konzepts aber wahrscheinlich die einzige Option. Und ja, Sie müssen alle Ereignis-Listener zurücksetzen, genau wie in der akzeptierten Antwort erwähnt. Sie würden auch einen einzigen Einstiegspunkt benötigen, wenn ich recht habe.

Oben drauf: Sie möchten eine Seite, die Ihnen per E-Mail Bericht erstattet, sobald sie ausgelöst wird. Hierfür können Sie beispielsweise Raven / Sentry verwenden. Das heißt aber, Sie produzieren sich selbst falsch positiv. In diesem Fall müssen Sie auch den Standardhandler aktualisieren, um solche Ereignisse herauszufiltern, oder solche Ereignisse im Dashboard von Sentry auf Ignorieren setzen.

window.stop ();

Dies funktioniert beim Laden der Seite nicht. Die Dekodierung der Seite wird ebenfalls gestoppt. Sie können es also nicht wirklich verwenden, um dem Benutzer eine Javascript-freie Variante Ihrer Seite anzubieten.

Debugger;

Stoppt die Ausführung nur bei geöffnetem Debugger. Funktioniert super, ist aber kein Ergebnis.

informatik-handwerk.de
quelle
1

In JavaScript gibt es mehrere Möglichkeiten, im Folgenden sind einige davon aufgeführt

Methode 1:

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

Methode 2:

return;

Methode 3:

return false;

Methode 4:

new new

Methode 5:

Schreiben Sie Ihre benutzerdefinierte Funktion mit der obigen Methode und rufen Sie an, wo Sie sie benötigen

Hinweis: Wenn Sie die Codeausführung nur anhalten möchten, können Sie sie verwenden

debugger; 
Srikrushna
quelle
0

Diese kleine Funktion kommt der Nachahmung von PHPs exit () ziemlich nahe. Fügen Sie wie bei den anderen Lösungen nichts anderes hinzu.

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

Erstellen Sie einfach eine BOOL-Bedingung, ohne dass hier komplizierter Code erforderlich ist.

Wenn Sie es auch nur einmal auf true / oder mehrmals umstellen, erhalten Sie beide eine Lösungslinie / nicht mehrere - im Grunde genommen so einfach.

moni
quelle
0

Wenn Sie eine undefinierte Funktion im Skript verwenden, wird das Skript aufgrund von "Uncaught ReferenceError" gestoppt. Ich habe versucht, indem ich dem folgenden Code gefolgt bin und die ersten beiden Zeilen ausgeführt habe.

Ich denke, dies ist der beste Weg, um das Skript zu stoppen. Wenn es einen anderen Weg gibt, kommentieren Sie mich bitte. Ich möchte auch einen anderen besten und einfachsten Weg kennenlernen. Übrigens habe ich in Javascript wie PHP keine Exit- oder Die-Funktion zum Beenden des Skripts erhalten. Wenn jemand es weiß, lass es mich wissen.

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
npsingh
quelle
0

Wenn Sie nur verhindern möchten, dass weiterer Code ausgeführt wird, ohne einen Fehler zu "werfen", können Sie ihn vorübergehend überschreiben, window.onerrorwie in 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
quelle
0

Ich benutze iobroker und habe es leicht geschafft, das Skript mit zu stoppen

stopScript();
user13449123
quelle
0

In den meisten Fällen nicht anwendbar, aber ich hatte viele asynchrone Skripte im Browser und als Hack mache ich das

window.reload();

alles zu stoppen.

M3RS
quelle
0

Ich weiß, dass dies alt ist, aber wenn Sie eine ähnliche PHP- die()Funktion wünschen , können Sie Folgendes tun:

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

Verwendung:

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

Im obigen Beispiel wird nur "Hallo" gedruckt.

Nanoo
quelle
-1

Ich benutze diesen Code, um die Ausführung zu stoppen:

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

Sie werden zwar einen Konsolenfehler erhalten, aber er funktioniert gut für mich.

John Smith
quelle
-2

Dies ist ein Beispiel dafür, dass Sie das Skript beenden, wenn eine Bedingung vorliegt. Ich verwende dies in meinem clientseitigen SSE-Javascript, wenn das

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

kann nicht direkt aus der JSON-Analyse analysiert werden ...

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

... sowieso ist die allgemeine Idee:

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

Dadurch wird Ihr Javasript-Skript beendet / beendet

Kapad
quelle
1
Dies beantwortet die Frage nicht wirklich. Sie sprechen von einem allgemeinen Problem, das nichts mit Ihren spezifischen SSE-Variablen / -Dateien zu tun hat.
mjk
1
mjk - jetzt besser?
Kapad
-3

Ich benutze die return-Anweisung anstelle von throw, da throw einen Fehler in der Konsole verursacht. Der beste Weg, dies zu tun, besteht darin, den Zustand zu überprüfen

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

Dadurch wird die Ausführung des Programms in dieser Zeile einfach gestoppt, anstatt Fehler in der Konsole zu melden.

iamsaurav
quelle
1
Es gibt jedoch den Fehler in Ihren Lintern als "Kann 'return' außerhalb der Funktion nicht verwenden"
Carles Alcolea
Die Ausführung wird gestoppt, da die Anweisung ungültig ist. Sie könnten auch if (condition) { new new }oder verwenden if (condition) { purpleMonkeyDishwasher(); }.
Coderer