Tengo un poco de confusión sobre setTimeout (devolución de llamada, retraso) y la definición general de asincronía en Javascript. Estas son mis dos preguntas...
¿Cómo es que el temporizador de retardo de setTimeout() se ejecuta ("cuenta atrás") inmediatamente incluso cuando el hilo principal aún se está ejecutando (no ha completado la pila de llamadas)? ¿Está utilizando trabajadores web o un hilo separado detrás de escena?
Cuando los programadores hablan de "Asynchronicity" en Javascript, ¿están hablando de la capacidad de ejecutar algún código en paralelo con el hilo principal (como cómo funciona la parte de retraso de setTimeout), O están hablando de la capacidad de simplemente posponer una función de ejecutando hasta que la pila de funciones del subproceso principal se haya vaciado (es decir, simplemente presionando una devolución de llamada en la cola de eventos para su posterior ejecución, como funciona la parte de devolución de llamada de setTimeout)?
¿Cómo es que el temporizador de retardo de setTimeout() se ejecuta ("cuenta atrás") inmediatamente incluso cuando el hilo principal aún se está ejecutando (no ha completado la pila de llamadas)?
No hay ningún código sentado allí que disminuya un contador. Se permite que la implementación varíe entre entornos (dado que el entorno proporciona setTimeout , no es parte de JavaScript), pero aquí hay uno probable: dado que el subproceso principal atiende una cola de trabajos, una implementación podría ver la lista de temporizadores antes de extrayendo el siguiente trabajo de la cola y, si es hora de que finalice un temporizador, agregue un trabajo a la cola para llamar a su devolución de llamada. Luego procesa esa llamada en orden desde la cola cuando aparece.
Cuando los programadores hablan de "Asynchronicity" en Javascript, ¿están hablando de la capacidad de ejecutar algún código en paralelo con el hilo principal (como cómo funciona la parte de retraso de setTimeout), O están hablando de la capacidad de simplemente posponer una función de ejecutándose hasta que la pila de funciones del subproceso principal se haya vaciado
Probablemente ambos y más, pero también menos. El punto de marcar que algo es asíncrono es decir "no verá ningún resultado para esto hasta que se complete la tarea actual" (ya que no se puede realizar una devolución de llamada asíncrona hasta que se complete la tarea). El motivo suele quedar claro en el contexto: porque tenemos que esperar a que llegue un recurso de red; porque tenemos que esperar a que el usuario haga clic en algo; porque tenemos que esperar hasta que el navegador esté a punto de mostrar el siguiente cuadro; porque tenemos que esperar a que se dispare un temporizador; porque... Entiendes la idea. :-)