2012-03-11 11 views
8

¿Qué equivale a presionar Ctrl + C en la consola, para Chrome y Firefox? Al implementar varios algoritmos, a menudo escribo algún buggy (while) loop, en Javascript, que no sale, hace que el navegador se congele. Recargar no funciona, hacer clic en la pequeña X para cerrar la pestaña no hace nada, y en un momento (literalmente) me quedo sin memoria, el sistema se intercambia y me voy a tomar un café.¿Cómo se interrumpe JS en el navegador?

+0

ctrl + alt + del – user544262772

+3

Tengo que admitir que esto fue más como una "motivación" para los desarrolladores de navegadores, para arreglar la situación. – skrat

+0

Los ejecutores de JS francamente existentes son estúpidos porque no pueden hacer algo tan simple. – Pacerier

Respuesta

5

No hay tal cosa como un Ctrl + C JavaScript. Los navegadores que ejecutan JavaScript generalmente son protectores de sí mismos. Si se bloquea el JavaScript, lanzarán un diálogo que le preguntará si el usuario desea detener el JavaScript.

La duración del tiempo de espera generalmente se puede encontrar en la configuración del navegador. Puede encontrar cómo hacerlo para Firefox aquí: http://www.trixya.net/index.php/internet/how-to-set-javascript-timeout-in-firefox

+1

Lanzan ese diálogo un poco tarde, cuando mi sistema ya está intercambiando. – skrat

5

En Chrome, puede pulsar Shift+ESC (o hacer clic con el botón derecho en la barra de título y abrir el Administrador de tareas de Chrome) y eliminar el proceso asociado a la pestaña colgada. Esto funcionará en casos donde cerrar la pestaña no lo haría.

La advertencia es que, a veces, Chrome simplificará varias pestañas en un solo proceso, y esto matará todas las pestañas asociadas con el proceso.


Otro enfoque que puede tomar para evitar while bucles colgando el navegador es escribir código como este (se puede llevar a cabo después de la prueba):

var maxIterations = 100000; 
while (foo) { 
    if (!maxIterations--) throw new Error('Max iterations hit, aborting.'); 
    // do stuff 
} 

Haga clic en Administrador de tareas de Chrome y seleccione el elemento en la parte inferior del menú contextual para revelar un extraño huevo de Pascua.

+0

'while (foo && --maxIterations) {...}' – vol7ron

+0

@ vol7ron Mantuve el elemento maxIterations en líneas separadas del resto del código para que pueda ser eliminado más adelante si fuera necesario –

+0

Entiendo lo que eres obra. Para mí, sería más fácil eliminar y mantener todo cerca. Tener un bloque if separado lo divide un poco - tienes que leer en el bloque while, en lugar de solo mirar las condiciones previas y las condiciones – vol7ron

1

De lo poco conocimiento que tengo en sus formas de trabajo, cómo iba a proceder es:

  • Sólo ejecutar la secuencia de comandos en un evento como botón de clic. Este script impediría correr onload
  • Chrome le permite establecer puntos de interrupción en el código js en la pestaña de secuencias de comandos de herramientas de desarrollo
0

No existe un "interruptor" real para ejecutar código JavaScript en un navegador. ECMAscript se ejecuta en el llamado "subproceso de interfaz de usuario", lo que significa que todas las operaciones de representación se realizan en la misma cola en que se ejecuta el código de ECMAscript.

Esto a su vez significa que un bucle infinito en ECMAscript bloquea automáticamente la interacción de todo el navegador.

La única manera de evitar eso es escribir un código claro y limpio. Si sucede de todos modos, la mayoría de los navegadores se dan cuenta de que el hilo de la interfaz de usuario está ocupado demasiado tiempo y le pregunta al usuario si desea cancelar los procesos en ejecución de JavaScript. Si no quiere esperar, su única opción es eliminar todo el proceso del navegador/pestaña.

Sin embargo, si usted es consciente de que una parte de la secuencia de comandos no posiblemente provocar un bucle infinito, puede configurar manualmente breakpoints en algún tipo de developer tools o puede insertar la palabra clave debugger; directamente en su guión.Eso provoca que el intérprete de JavaScript se detenga en la línea actual y usted tiene la oportunidad de analizar el próximo código (mientras que las condiciones, por ejemplo) y cancelar la ejecución si se ve mal.

+2

No puedo hacer nada, probar un ciclo 'while (1) {}' e intentar obtener una salida limpia (cerrar pestaña, cerrar ventana, etc.) – skrat

Cuestiones relacionadas