JavaScript-Äquivalent zum PHP-Würfel

99

Gibt es so etwas wie "sterben" in JavaScript? Ich habe es mit "break" versucht, funktioniert aber nicht :)

Cupakob
quelle
"die", wie "goto", sind mit strukturierter Programmierung nicht kompatibel. Diese Art von Anweisungen sollte niemals für ernsthafte Projekte verwendet werden. en.wikipedia.org/wiki/Structured_programming
Adrian Maire
3
function die(str) {throw new Error(str || "Script ended by death");}Oder etwas XD Viele bessere Optionen da draußen, aber das würde funktionieren. Könnte gut zum Debuggen sein, wenn Sie nur den ersten Teil eines Skripts ausführen möchten, um sicherzustellen, dass es funktioniert.
Niet the Dark Absol
@stefita Warum ist dein Kommentar nicht in den Antworten? exit () war genau das, was ich brauche. Die andere Möglichkeit besteht darin, eine Autocall-Schleife auszuführen, die 1599 Mal ausgeführt wird und dann die Ausführung stoppt. Vielen Dank.
m3nda
@AdrianMaire Dein Herz ist am richtigen Ort, aber das "Warum" einer Frage sollte nicht zur Debatte stehen. Die Übel die, goto, evalusw. sind endlos erbrochen (und nicht ohne Verdienst), aber sie haben alle ihre speziellen Anwendungen, vor allem für Low-Level - Debugging. Andernfalls würden die Sprachen sie nicht enthalten. In diesem Fall sind die JS-Äquivalente von returnund throwharmlos genug.
Beejor

Antworten:

33

Sie können breakeinen Blockbereich nur dann kennzeichnen, wenn Sie ihn beschriften. Beispielsweise:

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

Sie können einen Blockbereich nicht innerhalb einer Funktion im Bereich aufteilen. Das heißt, Sie können nichts tun wie:

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

Mit Funktionen können Sie jedoch etwas Ähnliches tun:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}
Eli Gray
quelle
5
Ich wusste nie, wie man einen Blockbereich beschriftet, geschweige denn, wie man einen Blockbereich schreibt. Bedeutet das, dass foo: {}es sich um ein Objekt handelt?
Enchance
3
Nein, es ist ein Blockumfang. Es ist das gleiche wiefoo: if(true){...}
Eli Gray
Gibt es eine Alternative, da Sie "einen Blockbereich nicht innerhalb einer Funktion im Bereich aufteilen" können?
Haykam
206
throw new Error("my error message");
Stephen Sorensen
quelle
7
Dies ist absolut die Antwort und funktioniert genauso wie die (); man sollte sich jedoch nicht um den roten "1 Fehler" von firebug kümmern!
Alexar
3
Ich denke, wenn PHP ein "Firebug" -Äquivalent hat, sollte es auch "1 Fehler" auf die () schreiben ;-) Gute Antwort!
Adrian Maire
1
Wird dadurch in IE8 kein Warndialogfeld angezeigt?
Sbichenko
Kein 1: 1-Äquivalent, da PHP auch nicht erfasste Ausnahmen hat.
Brilliand
Dies wird die Ausführung von AFAIK nicht vollständig stoppen, sondern nur ungefähr um den Wurf herum. Die Details sind sehr verschwommen, aber ich bin mir ziemlich sicher, dass das Skript an einem anderen Ort weiter ausgeführt werden kann.
Rolf
22

Sie können einfach das return;Beispiel verwenden

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

Die Rückkehr kehrt zur Hauptaufruffunktion test1 () zurück; und weiter von dort zu 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>

aber wenn Sie nur werfen werfen ''; Dadurch wird die Ausführung vollständig gestoppt, ohne dass Fehler auftreten.

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

Dies wird mit Firefox und Chrom getestet. Ich weiß nicht, wie das von IE oder Safari gehandhabt wird

themhz
quelle
2
Soweit ich weiß, wird returnnur die umschließende Funktion beendet. Es funktioniert nicht, wenn Sie die Ausführung des gesamten Skripts beenden möchten.
André Leria
1
hmmm ja du hast recht, es stoppt nicht die Ausführung des gesamten Skripts.
Themhz
throw "": ... ohne Fehler zu verursachen ... - Nicht ganz ...Uncaught ""
FZs
15

Ruf einfach an die() ohne es jemals zu definieren. Ihr Skript wird abstürzen. :) :)

Wenn ich das mache, rufe ich normalerweise an discombobulate() stattdessen an, aber das Prinzip ist das gleiche.

(Tatsächlich wirft dies ein ReferenceError, was ungefähr der Antwort von Spudly entspricht - aber für Debugging-Zwecke ist die Eingabe kürzer.)

Brilliand
quelle
Die Verwendung eines benutzerdefinierten undefinierten Bezeichners ist sehr kreativ! Mir gefällt, wie dieintuitiv und prägnant es ist. Es fehlt der Vorteil throw, eine bestimmte Fehlermeldung zu protokollieren, aber manchmal reicht nur die Zeilennummer aus. Übrigens, die;ohne die Klammern (un-) funktioniert auch.
Beejor
oder einfach sterben; an der Zeile, an der Ihr Javascript aufhören soll.
MarcoZen
Diese Antwort ist so JS-orientiert ^^ Es ist nicht schmutzig, wenn es funktioniert!
Yonn Trimoreau
7

Es ist möglich, eine eigene Version des PHP-Würfels zu würfeln:

function die(msg)
{
    throw msg;
}

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

test();

JSFiddle-Beispiel

Kelmar
quelle
Ich wollte erwähnen, dass dies in Fällen wie nicht funktioniert var a = arguments[3] || die('message'). Stattdessen denke ich, dass sterben sollte: function die(msg) { return eval(`throw "${msg}"`);)aber selbst dann denke ich, dass dies nur hart auf der Linie platziert werden sollte, die bricht, so dass der Fehler zeigt, welche Linie fehlgeschlagen ist, z. B. this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry
Wahrscheinlich nicht sicher, ob eval () das Problem löst, wenn ich Sie verstehe. Idealerweise würde man sich eine Stapelverfolgung ansehen, wenn Sie daran interessiert wären, wo tatsächlich ein Fehler aufgetreten ist. Andernfalls kann ich davon ausgehen, dass Sie Ihrem Benutzer lediglich eine grundlegende Fehlermeldung melden möchten.
Kelmar
7

Wenn Sie nodejs verwenden, können Sie verwenden

process.exit(<code>);
rickbsgu
quelle
4
Wenn es sich um node.js handeln würde, hätte die Frage das Tag node.js
FelixSFD
3
@ FelixSFD: Trotzdem hat es mir geholfen, als ich genau danach suchte und die Tags völlig ignorierte;)
DE
3

benutze Firebug und die herrliche ...

debugger;

und lassen Sie den Debugger niemals einen Schritt nach vorne machen. ErrorSauberer als ein richtiges Innit zu werfen?

Nourdine
quelle
2
Nicht genau das gleiche!
Rolf
2

Es gibt keine exakte Entsprechung des Sprachkonstrukts dievon PHP in Javascript . diein PHP ist so ziemlich gleich System.exit()in Java , das das aktuelle Skript beendet und Shutdown-Hooks aufruft. Wie einige Benutzer vorgeschlagen haben; throw Errorkann in einigen Fällen verwendet werden, garantiert jedoch niemals die Beendigung des aktuellen Skripts. Ihre throwAnweisung kann immer von einem Ausnahmebehandlungsblock umgeben sein - es sei denn, Sie rufen ihn auf dem obersten Skriptblock auf, der schließlich nur den von Ihnen ausgeführten Skriptblock beendet.

Es wird jedoch nicht verhindert, dass der zweite Block hier ausgeführt wird (druckt Hallo):

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

Sie können versuchen mit:

return 0;

das funktioniert im Falle eines Stoppprozesses.

Mohammed Yassine CHABLI
quelle
1

In JS gibt es keinen Funktionsexit, der php die () entspricht. Wenn Sie keine Funktion verwenden, können Sie einfach return verwenden.

return;
Manu Joseph
quelle
0

Sie können return false verwenden. Dadurch wird Ihr Skript beendet.

Bugfixer
quelle
3
Vermutlich nur auf der obersten Ebene. PHPs die () kann auf jeder Ebene aufgerufen werden und führt dazu, dass der PHP-Interpreter genau dort verschwindet.
Rolf
0

Dies sollte eine Art Arbeit wie die () sein;

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

Globale die () Funktion für Entwicklungszwecke:

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

Benutze die ():

die('Error message here');
gummiost
quelle
-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Arima
quelle