let a = true; setTimeout(() => {a = false}, 1000) while(a){console.log(a)}Debido a que JS tiene un solo subproceso, setTimeout se ejecutará después de 1000 ms cuando el subproceso no esté ocupado. Dado que este bucle while bloquea el subproceso, la devolución de llamada de setTimeout no tiene tiempo para ejecutarse y, por lo tanto a permanece true para siempre.
Puede encontrar más detalles sobre este tema aquí .
setTimeout es una función asíncrona, la devolución de llamada proporcionada se ejecutará solo cuando la pila de llamadas de JavaScript esté vacía. Como tenemos la condición "while (true)", siempre se ejecutará algo => la pila de llamadas nunca estará vacía => la devolución de llamada setTimeout nunca se ejecutará. Para obtener más información, lea sobre JavaScript Event Loop https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
Veamos esto paso a paso (si esto se ejecutó en los navegadores): -
let a = true; setTimeout(() => {a = false}, 1000) while(a){console.log(a)} let a = true; : Inicializaste una nueva variable a como verdadera;
setTimeout(() => {a = false}, 1000) : le ha dicho a la API web setTimeout del navegador que ejecute una devolución de llamada ( () => {a = false} ) en la que configuramos a como false después de un mínimo de 1 segundo . Mínimo porque esa devolución de llamada no se ejecutará a menos que la pila de ejecución de JavaScript (aquí es donde todo su código JS se ejecuta sincrónicamente ) esté vacía. Esta devolución de llamada después de 1 se coloca en una cola de eventos y se elimina de la cola solo cuando la pila de ejecución de JavaScript está vacía.
while(a){console.log(a)} : Esto se ejecutará sincrónicamente y bloqueará el hilo principal (donde está la pila de ejecución) ya que a siempre es verdadero. Nuestro hilo principal bloqueado significa que completar esta operación es demasiado costoso (tiene sentido ya que es un registro infinito) y, por lo tanto, la pila de ejecución de JavaScript nunca podría estar libre para cualquier devolución de llamada disponible en la cola de eventos . Eso significa que () => {a = false} , aunque esté disponible en la cola de eventos , nunca tendrá la oportunidad de ser eliminado y ejecutado en nuestra pila de ejecución de JavaScript .
La API web del navegador, esta pila de ejecución de JavaScript y la cola de eventos juntos forman nuestro ciclo de eventos para navegadores.
JavaScript es un lenguaje síncrono de subproceso único (¿recuerdas el subproceso principal?). Todo el comportamiento asíncrono que ve en sus aplicaciones o servidores web se debe a las otras partes que forman el bucle de eventos .
También esta es una imagen simplificada de la misma. Hay más divisiones en la cola de eventos, pero eso está más allá del alcance de esta pregunta.