Bucle infinito disparado por la ausencia de alerta ()

Por razones completamente más allá de mi comprensión, esta function funciona bien:

function foo() { var loop = true; var abc = ["a","b","c"]; var ctr = 0; while(loop) { $("<img />").error(function () { loop = false; }).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg"); alert(ctr); } } 

Pero mover la alert(ctr) fuera del while activa un ciclo infinito.

 function foo2() { var loop = true; var abc = ["a","b","c"]; var ctr = 0; while(loop) { $("<img />").error(function () { loop = false; }).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg"); } alert(ctr); } 

¿Alguien puede ayudar a aclarar?

5 Solutions collect form web for “Bucle infinito disparado por la ausencia de alerta ()”

Sería muy cauteloso de hacer lo que estás haciendo. Verá, esencialmente está girando en un bucle infinito, confiando en un evento de error lanzado por JS para interrumpir ese bucle. Imagino que está viendo el comportamiento anterior porque llamar a alert() está transmitiendo posts y dando la oportunidad de que el evento se active. En el último ejemplo, simplemente está girando la CPU, sin dar a otra cosa la oportunidad de suceder.

En su primer fragment, la llamada de la function de alert dentro del bucle hace que se detenga temporalmente, presumiblemente dando time a la callback de error para ejecutar, estableciendo el indicador de loop en false .

En su segundo fragment, cuando la llamada de alert no está presente en el while , el ciclo se ejecutará muchas veces, disparando la advertencia de secuencia de commands de larga ejecución del browser.

Javascript es de un solo subprocess y sincrónico. Si elimina la alerta, su ciclo lo mantendrá ocupado y no se lanzará el error (en realidad, se pondrá en queue) hasta que finalice el process. La alerta hace que su bucle infinito se detenga por un time y permite que Javascript procese los events en queue.

No puedo ver por qué, pero parece que en el segundo caso hay una confusión de scope variable por alguna razón.

En la mayoría de los browseres, no se escribirá nada en la página hasta que el usuario tenga explícitamente el control (en su caso a través de una alerta) o el javascript llegue a la conclusión natural. el .error () nunca se hace sin la alerta para pausar el ciclo.

¿Sería posible escribir un ciclo for dado la duración de abc?

  • Cargando files locales con Javascript sin un server web
  • ¿Por qué no puedo definir funciones en document.ready () de jQuery?
  • Dibujar arco con un radio creciente
  • Resaltar subcadena en elemento
  • ¿Existe un código de código abierto para crear text e icons de "vista previa del enlace", como en Facebook?
  • Cómo atrapar una respuesta de 400 en jQuery getJSON call
  • Comparación de date Jquery
  • Obtener contenido dentro del script como text
  • Error de script AngularJS v1.2.5 con textarea y el atributo de marcador de position usando IE11
  • Detener jQuery que se puede arrastrar desde el desplazamiento fuera de la pantalla
  • posible método claro jquery `one`
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.