JavaScript equivalente al dado de PHP


100

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



"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;
}}

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

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


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).


¡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


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

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?


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> 


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;

0

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


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;
}

0

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

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

Utilice die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.