let x = 0; function a() { console.log("called a()"); for (let i=0; i<123456789; ++i) { x += Math.sqrt(2); } console.log("x = "+x); } function b() { x = undefined; console.log("called b()"); } setTimeout(b, 20); a();producción:
called a() x = 174594265.7306214 called b() b debería haberse llamado antes, pero esperó hasta que se completó la a .
Sé que js usa solo un hilo, pero el procesador podría haber cambiado entre ejecutar a y b durante a ejecución de a. ¿El procesador siempre ejecuta solo una función a la vez (si no hay una espera interna)? ¿En nodejs y en el sitio web javascript?
EDITAR:
Aquí hay un ejemplo de espera:
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } let x = 0; async function a() { console.log("called a()"); await sleep(1000); for (let i=0; i<123456789; ++i) { x += Math.sqrt(2); } console.log("x = "+x); } function b() { x = undefined; console.log("called b()"); } setTimeout(b, 20); a();producción:
called a() called b() x = NaN observe cómo x se convierte en NaN, ya que b se ejecuta durante a
b debería haberse llamado antes, pero esperó hasta que se completó la función.
No. b debe llamarse después de que se haya ejecutado su código síncrono porque es cuando se llama a una función pasada a setTimeout .
La función de devolución de llamada de setTimeout está programada para ejecutarse después del retraso que especifique como segundo argumento para setTimeout . Este retraso es la cantidad mínima de tiempo que llevará ejecutar la función de devolución de llamada programada con setTimeout .
Una vez que el temporizador expira, esa función de devolución de llamada se coloca en una cola de tareas y desde allí se envía a la pila de llamadas, PERO solo se envía una vez que la pila de llamadas está vacía.
En su caso, la pila de llamadas estará vacía cuando su secuencia de comandos haya terminado su ejecución.
Sé que js usa solo un hilo, pero el procesador podría haber cambiado entre ejecutar a y b durante la ejecución de a
Eso no es posible con solo 1 hilo. En Javascript, solo se ejecuta una cosa en un momento dado, a menos que use otro hilo .
¿El procesador siempre ejecuta solo una función a la vez (si no hay espera dentro)?
Sí. Incluso con await , la función se detiene hasta que se liquida la promesa. Una vez que se establece la promesa, esa función continúa ejecutándose y en ese momento, nada más se ejecuta.
observe cómo x se convierte en NaN, ya que b se ejecuta durante un
No, no hay interferencia aquí. La función a se ejecuta sincrónicamente hasta la siguiente instrucción
await sleep(1000); Mientras la función a está en pausa, esperando que se establezca la promesa devuelta por sleep(...) , durante este tiempo, la función b se ejecuta porque su temporizador ha expirado y la pila de llamadas está vacía.
Dado que ambas funciones se asignan a la misma variable x , el valor de x es NaN porque su valor antes de que la función a se reanude no está undefined y realizar sumas en undefined conduce a NaN .