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?

  • Buena jQuery Autocomplete que no forma parte de jQuery UI?
  • Complemento JavaScript fullCalendar que lee 'applyAll' como indefinido en gcal.js
  • jQuery.getJSON (). error () no se está ejecutando en error 404
  • ¿Por qué no puedo recuperar la altura calculada del contenido insertado en respuesta a una request jQuery AJAX?
  • jQuery diferencia entre: eq () y: nth-child ()
  • ¿Los jQuery's $ (selector) .eq (índice) y $ (selector) son ​​iguales?
  • El ancho () de JQuery no excluye el relleno de los elementos dentro del intervalo oculto
  • ¿Cómo puedo evitar que $ .getJSON de jQuery convierta mis keys de respuesta ajax de cadenas a integers?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.