¿Cómo terminar el script en JavaScript?

149

¿Cómo puedo salir del script JavaScript como PHP exito die? Sé que no es la mejor práctica de programación, pero necesito hacerlo.

Nir
fuente
1
¿Crees que podrías ampliar este requisito, exactamente por qué estás tratando de lograrlo?
andynormancx
8
@andynormancx, esto puede ser útil para la depuración.
SET
3
tal return;vez sea suficiente según sus requisitos, actúa como die () sin parámetros.
Ishikawa
2
Si lo "necesita", es mejor que reconsidere su diseño.
Frungi
18
¿Por qué siempre es la primera pregunta 'por qué'?
John Ktejik

Respuestas:

80

JavaScript equivalente para PHPdie . Por cierto, solo llama exit()(gracias 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
fuente
1
Aquí está el código fuente de salida: kevin.vanzonneveld.net/techblog/article/…
splattne
Ese código no parece detener la activación de eventos en elementos, solo los eventos de la ventana. Por lo tanto, también debería recorrer todos los elementos de la página haciendo algo similar. Sin embargo, todo parece un requisito muy extraño.
andynormancx
2
todo el concepto de troquel está un poco roto: el flujo debe ser capaz de manejar todas y cada una de las eventualidades, ya sea que requiera try-catch o no.
annakata
Creo que no incluyó todos los eventos que deberían manejarse, como el evento "selectstart".
Ono Oogami
44
No puede detener los controladores XMLHttpRequest. El código actual no detiene la ejecución de intervalos o tiempos de espera. Demostración: jsfiddle.net/skibulk/wdxrtvus/1 Puede considerar esto como una solución: stackoverflow.com/a/8860203/6465140
skibulk
73

Las funciones de "salida" suelen salir del programa o script junto con un mensaje de error como parámetro. Por ejemplo morir (...) en php

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

El equivalente en JS es señalar un error con la palabra clave throw así:

throw new Error();

Puedes probar esto fácilmente:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
fuente
46
@Sydwell: Si lo rodea con un bloque catch, será capturado y el programa no terminará, desafiando el punto aquí.
final
44
No olvide que puede agregar un mensaje al error: arroje un nuevo error ('variable =' + x); Es una buena manera de finalizar rápidamente un script mientras trabaja en él y obtener el valor de una variable.
Andrew Swift
1
@ultimate Creo que #Sydwell ment para envolver todo el script en try / catch, para que pueda obtener a) salida limpia b) posible mensaje de excepción cuando sea necesario :) Lanzar excepciones no buscadas generalmente no trae nada bueno :)
jave.web
47

Incluso en programas simples sin identificadores, eventos y demás, es mejor poner el código en una función "principal", incluso cuando es el único procedimiento:

<script> 
function main()
{
//code

}
main();
</script>

De esta manera, cuando desee detener el programa, puede usar "return".

Jhep
fuente
15

Si no te importa que sea un error, solo escribe:

fail;

Eso detendrá su código principal (global) de proceder. Útil para algunos aspectos de la depuración / prueba.

Bagazo
fuente
1
window.failno está definido en los navegadores actuales.
mikemaccana
8
Ese es el punto, también podría hacerlo mikeyMouse;, el error terminará. Es rápido y sucio.
Marc
2
Ah, bastante justo, ¿tal vez agregar eso a tu respuesta?
mikemaccana
13

Hay muchas formas de salir de un script JS o Node. Aquí están los más relevantes:

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

Si está en REPL (es decir, después de ejecutar nodeen la línea de comando), puede escribir .exitpara salir.

not2qubit
fuente
No quería insultar la inteligencia de los lectores explicando un acrónimo que aparece como el primer resultado de Googlearlo. Le sugiero que no mezcle el código JavaScript con los comandos REPL porque si un usuario copia / pega ese bloque de código y lo ejecuta, obtendrá un error de sintaxis en la línea ".exit".
Dan Dascalescu
6

En mi caso, utilicé la window.stopAPI, que es como hacer clic en el botón X en su navegador:

window.stop();
Musa
fuente
5

Coloque la debugger;palabra clave en su código JavaScript donde desea detener la ejecución. Luego abra las herramientas de desarrollador de su navegador favorito y vuelva a cargar la página. Ahora debería detenerse automáticamente. Abra la sección Orígenes de sus herramientas: la debugger;palabra clave se resalta y tiene la opción de reanudar la ejecución del script.

Espero que ayude.

Mas información en:

abajo
fuente
2

Creo que esta pregunta ha sido respondida, haga clic aquí para obtener más información. A continuación se muestra la respuesta corta que se publica.

throw new Error("Stop script");

También puede usar su navegador para agregar puntos de interrupción, cada navegador es similar, consulte la información a continuación para su navegador.

Para obtener información sobre los puntos de ruptura de Chrome, haga clic aquí
Para obtener información sobre los puntos de ruptura de Firefox, haga clic aquí
Para obtener información sobre los puntos de ruptura de Explorer, haga clic
Para obtener información sobre los puntos de ruptura de Safari, haga clic aquí

alfmonc
fuente
1

Si está buscando una manera de terminar por la fuerza la ejecución de todos los Javascript en una página, no estoy seguro de que haya una forma oficial de hacerlo: parece ser el tipo de cosa que podría ser un riesgo de seguridad (aunque para sea ​​honesto, no puedo pensar en cómo sería fuera de mi cabeza). Normalmente en Javascript cuando desea que su código deje de ejecutarse, simplemente returndesde cualquier función que se esté ejecutando. (La returndeclaración es opcional si es lo último en la función y la función no debe devolver un valor). Si hay alguna razón por la que regresar no es lo suficientemente bueno para usted, probablemente debería editar más detalles en la pregunta de por qué piensa lo necesita y quizás alguien pueda ofrecerle una solución alternativa.

Tenga en cuenta que, en la práctica, la mayoría de los intérpretes Javascript de los navegadores simplemente dejarán de ejecutar el script actual si encuentran un error. Entonces puede hacer algo como acceder a un atributo de una variable no establecida:

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

y probablemente abortará el guión. Pero no debe contar con eso porque no es del todo estándar, y realmente parece una práctica terrible.

EDITAR : OK, tal vez esta no fue una buena respuesta a la luz de Ólafur. Aunque la die()función a la que se vinculó básicamente implementa mi segundo párrafo, es decir, solo arroja un error.

David Z
fuente
1
Todo lo que hará detendrá el bit de ejecución actual de secuencias de comandos. No impedirá que nuevos eventos se activen y ejecuten nuevos fragmentos de script.
andynormancx
Sin mencionar que no necesita una mala función adicional para generar un error. Javascript tiene una declaración de lanzamiento incorporada.
Chris
La función de morir hace mucho más que su p.blah (), ejecuta los eventos de Windows y reemplaza los controladores que tienen con "e.preventDefault (); e.stopPropagation ();", lo que detendrá el disparo de los eventos. Entonces arroja una excepción.
andynormancx
1

lanzar "";

Es un mal uso del concepto pero probablemente sea la única opción. Y sí, deberá restablecer todos los oyentes de eventos, tal como se menciona en la respuesta aceptada. También necesitaría un único punto de entrada si tengo razón.

Además: desea una página que le informe por correo electrónico tan pronto como se lance; puede usar, por ejemplo, Raven / Sentry para esto. Pero eso significa que te produces falsos positivos. En tal caso, también debe actualizar el controlador predeterminado para filtrar dichos eventos o establecer dichos eventos en ignorar en el panel de Sentry.

window.stop ();

Esto no funciona durante la carga de la página. También detiene la decodificación de la página. Por lo tanto, realmente no puede usarlo para ofrecer al usuario una variante de su página sin JavaScript.

depurador

Detiene la ejecución solo con el depurador abierto. Funciona muy bien, pero no se puede entregar.

informatik-handwerk.de
fuente
1

En JavaScript hay varias formas, a continuación se muestran algunas de ellas.

Método 1:

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

Método 2:

return;

Método 3:

return false;

Método 4:

new new

Método 5:

escriba su función personalizada use el método anterior y llame donde lo necesite

Nota: Si solo quieres pausar la ejecución del código, puedes usar

debugger; 
Srikrushna
fuente
0

Esta pequeña función se acerca bastante a imitar la salida de PHP (). Al igual que con las otras soluciones, no agregue nada más.

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

Simplemente cree una condición BOOL, no necesita código complicado aquí ...

Si incluso una vez que lo convierta en verdadero / o varias veces, ambos le darán una línea de solución / no múltiples, básicamente así de simple.

moni
fuente
0

Si utiliza alguna función indefinida en el script, el script se detendrá debido a "Error de referencia no detectado". Lo intenté siguiendo el código y las dos primeras líneas ejecutadas.

Creo que esta es la mejor manera de detener el guión. Si hay otra forma, por favor comenteme. También quiero conocer otra manera mejor y simple. Por cierto, no obtuve la función incorporada salir o morir en Javascript como PHP para terminar el script. Si alguien lo sabe, hágamelo saber.

alert('Hello');

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

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

alert('bye');

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

Si solo desea evitar que se ejecute más código sin "arrojar" ningún error, puede anular temporalmente window.onerrorcomo se muestra en 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
fuente
0

Estoy usando iobroker y logré detener fácilmente el script con

stopScript();
usuario13449123
fuente
0

No es aplicable en la mayoría de las circunstancias, pero tenía muchos scripts asíncronos ejecutándose en el navegador y, como hack, lo hago

window.reload();

para detener todo

M3RS
fuente
0

Sé que esto es viejo, pero si quieres una die()función PHP similar , puedes hacer:

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

Uso:

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

El ejemplo anterior solo imprimirá "Hola".

Nanoo
fuente
-1

Yo uso este código para detener la ejecución:

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

Sin embargo, recibirá un error de consola, pero funciona bien para mí.

John Smith
fuente
-2

Este es un ejemplo de que, si existe una condición, termina el script. Lo uso en mi SSE javascript del lado del cliente, si el

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

no se puede analizar directamente desde el análisis JSON ...

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

... de todos modos la idea general es:

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

esto terminará / morirá su script javasript

kapad
fuente
1
Esto realmente no responde la pregunta. Están hablando de un problema general, nada que ver con sus variables / archivos SSE específicos.
mjk
1
mjk - mejor ahora?
kapad
-3

Yo uso la declaración de retorno en lugar de throw como throw da error en la consola. la mejor manera de hacerlo es verificar la condición

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

esto simplemente detiene la ejecución del programa desde esa línea, en lugar de dar errores en la consola.

iamsaurav
fuente
1
Sin embargo, da el error en sus linters como "No se puede usar 'return' fuera de la función"
Carles Alcolea
Se detiene la ejecución porque la declaración no es válida. También puedes usar if (condition) { new new }o if (condition) { purpleMonkeyDishwasher(); }.
Coderer