En el código a continuación, el retraso para 2 es de 0 segundos, entonces, ¿por qué genera 2 después de 3 y no antes?
(function() { console.log(1); setTimeout(function(){console.log(2)}, 0); console.log(3); })();Ejecutará en la siguiente materia:
1 3 2
setTimeout se implementa de una manera que debe ejecutarse después de un retraso mínimo dado, y una vez que el hilo del navegador está libre para ejecutarlo. entonces, por ejemplo, si especifica un valor de 0 para el parámetro de retraso y cree que se ejecutará "inmediatamente", no lo hará. se ejecutará, con mayor precisión, en el próximo ciclo de eventos (que es parte del ciclo de eventos, modelo de concurrencia que es responsable de ejecutar el código).
Por lo tanto, la impresión de 1 y 3 en realidad se enviará a la pila de llamadas y se ejecutará de inmediato, ya que la función de devolución de llamada setTimeout solo estará disponible para extraerse de la cola de eventos y seleccionarse en el siguiente ciclo de eventos.
Lea el motivo de los retrasos más largos de lo especificado: https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#reasons_for_delays_longer_than_specified
Más información sobre el bucle de eventos de JS: https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
setTimeout() no retrasa todo lo que se llama después; sólo retrasa la función interior. Por lo tanto, inicia un temporizador para console.log(2) , continúa con el código restante, console.log(3) , y luego ejecuta la función de tiempo de espera cuando se agota el temporizador.
Esta declaración de función anónima autoinvocada
function (function() { console.log(1); setTimeout(function(){console.log(2)}, 0); console.log(3); })();es lo mismo que si hubieras escrito
console.log(1); setTimeout( console.log, 0, 2); console.log(3); y el orden de los registros será el mismo, ya sea envuelto o desenvuelto en una función cronometrada anónima, porque se resolverá durante el tiempo de ejecución , mientras que la declaración setTimeout es un programa y tendrá que esperar hasta que el programa comience a ejecutarse. Y será después de que JITC haya terminado de compilar su código.