Equivalente JavaScript del die di PHP


100

C'è qualcosa come "morire" in JavaScript? Ho provato con "break", ma non funziona :)



"die", come "goto" non sono compatibili con la programmazione strutturata. Questi tipi di istruzioni non dovrebbero mai essere usati per progetti seri. en.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}O qualcosa del genere XD Ci sono molte opzioni migliori là fuori, ma funzionerebbe. Potrebbe essere utile per il debug, se vuoi solo eseguire la prima parte di uno script per assicurarti che funzioni.
Niet the Dark Absol

@stefita Perché il tuo commento non è nelle risposte ?? exit () era proprio quello di cui avevo bisogno. L'altro modo, è eseguire un ciclo di chiamata automatica, verrà eseguito 1599 volte quindi interromperà l'esecuzione. Grazie.
m3nda

@AdrianMaire Il tuo cuore è al posto giusto, ma il "perché" di una domanda non dovrebbe essere in discussione. I mali di die, goto, eval, ecc, sono infinitamente rigurgitato (e non senza merito), ma tutti hanno i loro usi speciali, in particolare per il debug di basso livello. Altrimenti le lingue non li includerebbero. In questo caso, gli equivalenti JS di returne throwsono abbastanza innocui.
Beejor

Risposte:


34

Puoi solo breakun ambito di blocco se lo etichetti. Per esempio:

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

Non è possibile interrompere l'ambito di un blocco dall'interno di una funzione nell'ambito. Ciò significa che non puoi fare cose come:

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

Puoi fare qualcosa di simile anche se con le funzioni:

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

5
Non ho mai saputo etichettare un ambito di blocco e tanto meno scrivere un ambito di blocco. Significa che foo: {}è un oggetto?
Enchance

3
No. È un ambito di blocco. È lo stesso difoo: if(true){...}
Eli Grey

Esiste un'alternativa dal momento che non è possibile "interrompere un ambito di blocco dall'interno di una funzione nell'ambito"?
haykam

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

7
questa è assolutamente la risposta e funziona proprio come die (); tuttavia non dovrebbe interessare il rosso "1 Error" di firebug!
Alexar

3
Penso che se PHP ha un equivalente "firebug", dovrebbe anche scrivere "1 error" su die () ;-) Buona risposta!
Adrian Maire

1
Questo non produrrà una finestra di dialogo di avviso in IE8?
sbichenko

Non è un equivalente 1 a 1, poiché anche PHP ha eccezioni non rilevate.
Brilliand

Ciò non interromperà completamente l'esecuzione AFAIK, ma solo approssimativamente intorno al lancio. Le specifiche sono molto sfocate ma sono abbastanza sicuro che lo script possa continuare a funzionare da qualche altra parte.
Rolf

22

Puoi semplicemente usare l' return;esempio

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

Il ritorno tornerà alla funzione chiamante principale test1 (); e continuare da lì a 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>

ma se aggiungi solo lancio ''; questo interromperà completamente l'esecuzione senza causare errori.

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

Questo è testato con Firefox e Chrome. Non so come questo venga gestito da IE o Safari


2
Per quanto ne so, returnesce solo dalla funzione di inclusione. Non funziona quando si desidera interrompere l'esecuzione dell'intero script.
André Leria

1
hmmm sì hai ragione, non ferma l'esecuzione di tutto lo script.
themhz

throw "": ... senza causare errori ... - Non proprio ...Uncaught ""
FZ

15

Basta chiamare die()senza mai definirlo. Il tuo script andrà in crash. :)

Quando lo faccio, di solito chiamo discombobulate()invece, ma il principio è lo stesso.

(In realtà, ciò che fa è lanciare un ReferenceError, rendendolo più o meno uguale alla risposta di Spudly, ma è più breve da digitare, per scopi di debug.)


L'uso di un identificatore personalizzato non definito è molto creativo! Mi piace come dieè intuitivo e conciso. Manca il vantaggio di throwquando si tratta di registrare un messaggio di errore specifico, ma a volte è sufficiente solo il numero di riga. A proposito, anche die;senza le parentesi (non) funziona.
Beejor

o semplicemente morire; alla riga in cui vuoi che il tuo javascript si fermi.
MarcoZen

Questa risposta è così orientata a JS ^^ Non è sporco se funziona!
Yonn Trimoreau

7

È possibile lanciare la propria versione del dado di PHP:

function die(msg)
{
    throw msg;
}

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

test();

Esempio di JSFiddle


Volevo dire che questo non funzionerà in casi come var a = arguments[3] || die('message'). invece, penso che morire dovrebbe essere: function die(msg) { return eval(`throw "${msg}"`);)ma anche in questo caso, penso che questo dovrebbe essere semplicemente posizionato sulla linea che si interrompe in modo che l'errore mostri quale linea non è riuscita, ad esempio this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

Probabilmente, non sono sicuro che eval () risolva il problema se ti capisco. Idealmente si guarderebbe una traccia dello stack se fossi interessato a dove si stava effettivamente verificando un errore. Altrimenti penserei che sia lecito ritenere che tu voglia semplicemente segnalare una sorta di messaggio di errore di base per il tuo utente.
Kelmar

7

Se stai usando nodejs, puoi usare

process.exit(<code>);

4
Se si trattasse di node.js, la domanda avrebbe il tag node.js
FelixSFD

3
@FelixSFD: Comunque mi ha aiutato, dato che stavo cercando esattamente questo, ignorando completamente i tag;)
DE

3

usa firebug e il glorioso ...

debugger;

e non lasciare mai che il debugger faccia alcun passo avanti. ErrorPiù pulito che lanciare un vero e proprio , vero?


2
Non esattamente lo stesso!
Rolf

2

Non esiste un equivalente esatto del costrutto linguistico diedi PHP in Javascript . diein PHP è praticamente uguale System.exit()in Java , che termina lo script corrente e chiede ganci di arresto. Come suggerito da alcuni utenti; throw Errorpuò essere utilizzato in alcuni casi, tuttavia non garantisce mai la fine dello script corrente. Può esserci sempre un blocco di gestione delle eccezioni che circonda la tua throwistruzione, a meno che tu non lo chiami sul blocco di script di livello più alto, che alla fine esce solo dal blocco di script che stai eseguendo.

Tuttavia non impedisce che il secondo blocco venga eseguito qui (stampa ciao):

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


1

Non esiste una funzione exit equivalente a php die () in JS, se non stai usando nessuna funzione puoi semplicemente usare return;

return;

0

Puoi usare return false; Questo terminerà il tuo script.


3
Solo al livello più alto, presumibilmente. Die () di PHP può essere chiamato a qualsiasi livello e farà scomparire l'interprete PHP.
Rolf

0

Questo dovrebbe funzionare come die ();

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

0

Funzione globale die () per scopi di sviluppo:

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

Usa die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.