JavaScript equivalente al dado de PHP

100

¿Hay algo como "morir" en JavaScript? Lo intenté con "romper", pero no funciona :)

cupakob
fuente
"morir", como "goto" no son compatibles con la programación estructurada. Este tipo de instrucciones nunca deben usarse para proyectos serios. en.wikipedia.org/wiki/Structured_programming
Adrian Maire
3
function die(str) {throw new Error(str || "Script ended by death");}O algo XD Hay muchas opciones mejores, pero esto funcionaría. Podría ser bueno para la depuración, si solo desea ejecutar la primera parte de un script para asegurarse de que funcione.
Niet the Dark Absol
@stefita ¿Por qué no está tu comentario en las respuestas? exit () era justo lo que necesitaba. La otra forma es ejecutar un bucle de llamada automática, se ejecutará 1599 veces y luego detendrá la ejecución. Gracias.
m3nda
@AdrianMaire Tu corazón está en el lugar correcto, pero el "por qué" de una pregunta no debería ser un problema. Los males de die, goto, eval, etc son regurgitados sin fin (y no sin mérito), pero todos ellos tienen sus usos especiales, especialmente para la depuración de bajo nivel. De lo contrario, los idiomas no los incluirían. En este caso, los equivalentes JS de returny throwson lo suficientemente inocuos.
Beejor

Respuestas:

34

Solo puede breakbloquear un alcance si lo etiqueta. Por ejemplo:

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

No puede romper un alcance de bloque desde dentro de una función en el alcance. Esto significa que no puede hacer cosas como:

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

Sin embargo, puedes hacer algo similar con las funciones:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}
Eli Grey
fuente
5
Nunca supe sobre etiquetar un alcance de bloque y mucho menos escribir un alcance de bloque. ¿Significa que foo: {}es un objeto?
mejora el
3
No. Es un alcance de bloque. Es lo mismo quefoo: if(true){...}
Eli Gray
¿Existe alguna alternativa ya que no puede "romper un alcance de bloque desde dentro de una función en el alcance"?
haykam
207
throw new Error("my error message");
Stephen Sorensen
fuente
7
esta es absolutamente la respuesta y funciona igual que die (); sin embargo, ¡uno no debería preocuparse por el rojo "1 Error" de firebug!
Alexar
3
Creo que si PHP tiene un equivalente "firebug", también debería escribir "1 error" en die () ;-) ¡Buena respuesta!
Adrian Maire
1
¿No producirá esto un cuadro de diálogo de advertencia en IE8?
sbichenko
No es un equivalente 1 a 1, ya que PHP también tiene excepciones no detectadas.
Brillante
Esto no detendrá totalmente la ejecución AFAIK, sino solo aproximadamente alrededor del lanzamiento. Los detalles son muy borrosos, pero estoy bastante seguro de que el script puede seguir ejecutándose en otro lugar.
Rolf
22

Simplemente puede usar el return;ejemplo

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

El retorno volverá a la función principal de llamada test1 (); y continúe desde allí hasta 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>

pero si solo agrega lanzar ''; esto detendrá completamente la ejecución sin causar ningún error.

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

Esto se prueba con Firefox y Chrome. No sé cómo IE o Safari manejan esto

themhz
fuente
2
Hasta donde yo sé, returnsolo sale de la función de cierre. No funciona cuando desea dejar de ejecutar todo el script.
André Leria
1
hmmm sí tienes razón, no detiene la ejecución de todo el script.
themhz
throw "": ... sin causar ningún error ... - No del todo ...Uncaught ""
FZ
15

Simplemente llame die()sin definirlo nunca. Tu guión fallará. :)

Cuando hago esto, normalmente llamo en su discombobulate()lugar, pero el principio es el mismo.

(En realidad, lo que hace es lanzar un ReferenceError, por lo que es aproximadamente lo mismo que la respuesta de Spudly, pero es más corto de escribir, para fines de depuración).

Brillante
fuente
¡El uso de un identificador indefinido personalizado es muy creativo! Me gusta cómo diees intuitivo y conciso. Carece del beneficio de throwcuando se trata de registrar un mensaje de error específico, pero a veces solo el número de línea es suficiente. Por cierto, die;sin los paréntesis (un-) también funciona.
Beejor
o simplemente muere; en la línea donde desea que se detenga su javascript.
MarcoZen
Esta respuesta es tan JS ^^ ¡No es sucio si funciona!
Yonn Trimoreau
7

Es posible lanzar su propia versión del dado de PHP:

function die(msg)
{
    throw msg;
}

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

test();

Ejemplo de JSFiddle

Kelmar
fuente
Quería mencionar que esto no funcionará en casos como var a = arguments[3] || die('message'). en su lugar, creo que morir debería ser: function die(msg) { return eval(`throw "${msg}"`);)pero incluso entonces, creo que esto debería colocarse en la línea que se rompe para que el error muestre qué línea falló, por ejemplo this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry
Probablemente, no estoy seguro de que eval () resuelva el problema si te entiendo. Idealmente, uno estaría mirando un seguimiento de pila si estuviera interesado en dónde estaba ocurriendo realmente una falla. De lo contrario, creo que es seguro asumir que simplemente desea informar algún tipo de mensaje de falla básico a su usuario.
Kelmar
7

Si está usando nodejs, puede usar

process.exit(<code>);
rickbsgu
fuente
4
Si se tratara de node.js, la pregunta tendría la etiqueta node.js
FelixSFD
3
@FelixSFD: Aún así me ayudó, ya que estaba buscando exactamente esto, ignorando por completo las etiquetas;)
DE
3

usa firebug y el glorioso ...

debugger;

y nunca deje que el depurador dé un paso adelante. Más limpio que lanzar un buen Error, ¿no?

nutrir
fuente
2
¡No es exactamente lo mismo!
Rolf
2

No hay un equivalente exacto de la construcción diedel lenguaje de PHP en Javascript . dieen PHP es prácticamente igual que System.exit()en Java , que finaliza el script actual y llama a los hooks de cierre. Como sugirieron algunos usuarios; throw Errorse puede utilizar en algunos casos, sin embargo, nunca garantiza la terminación del script actual. Siempre puede haber un bloque de manejo de excepciones alrededor de su throwdeclaración, a menos que lo llame en el bloque de script de nivel superior, que eventualmente sale solo del bloque de script que está ejecutando.

Sin embargo, no evitará que el segundo bloque se ejecute aquí (imprime hola):

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

puedes probar con:

return 0;

que funcionan en caso de detener el proceso.

Mohammed Yassine CHABLI
fuente
1

No hay una función de salida equivalente a php die () en JS, si no está usando ninguna función, simplemente puede usar return;

return;
Manu Joseph
fuente
0

Puede usar return false; Esto terminará su secuencia de comandos.

Corrector de errores
fuente
3
Solo en el nivel superior, presumiblemente. El die () de PHP se puede llamar en cualquier nivel y hará que el intérprete de PHP desaparezca allí mismo.
Rolf
0

Esto debería funcionar como die ();

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

Función global die () para fines de desarrollo:

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

Utilice die ():

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