Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

313
Views
En javascript, ¿por qué el siguiente código no sale del bucle?
let a = true; setTimeout(() => {a = false}, 1000) while(a){console.log(a)}
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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í .

over 4 years ago · Santiago Trujillo Report

0

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

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!