es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuándo obtiene la función de devolución de llamada setTimeOut sus parámetros?

Estoy un poco confundido acerca de cómo funciona setTimeOut:
¿Por qué la función de devolución de llamada no recibió los valores que necesitaba cuando fue invocada, pero los obtuvo desde la parte inferior del script?

Esperaba que imprimiera 5 y no 7…

¿Qué me falta?

Cualquier ayuda es apreciada, ¡gracias!

let foo = () => {
console.log(x);
};

let x = 5;
setTimeout(foo, 0); //7
for (let i = 0; i < 10000000000; i++) {} //solo para desperdiciar algo de tiempo porque el timeOut es en realidad 4ms
x = 7;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Explicación de setTimeOut y Función de Llamada

    setTimeout es una función en JavaScript que se utiliza para retrasar la ejecución de una función específica. Programa una tarea para que se realice después de un tiempo especificado.

    En el fragmento de código proporcionado, se define una función de llamada (callback function) llamada foo con una instrucción de registro en consola que muestra el valor actual de x. La variable x se establece inicialmente en 5, y la función foo se pasa como parámetro a la función setTimeout, junto con un valor de tiempo de espera de 0.

    El bucle for que sigue a la función setTimeout se utiliza para perder algo de tiempo para que el valor de tiempo de espera sea de 4 ms. Finalmente, el valor de x se cambia a 7.

    Cuando se ejecuta la función setTimeout, programa la ejecución de la función de llamada foo después del valor de tiempo de espera de 0ms. Pero como el bucle for toma más de 4ms de retraso, la función de llamada no se invoca inmediatamente. Mientras tanto, fuera del bucle for, el valor de x se cambia a 7.

    Por lo tanto, cuando se ejecuta la función foo, muestra el valor actual de x, es decir, 7, ya que es el último valor asignado a x. Es por eso que muestra 7 en lugar de 5.

    Si desea mostrar el valor inicial de x, es decir, 5, puede modificar el código pasando el valor de x como argumento a la función foo, como se muestra a continuación:

    let foo = (val) => {
      console.log(val);
    };
    
    let x = 5;
    setTimeout(() => foo(x), 0); //5
    for (let i = 0; i < 10000000000; i++) {} //solo para perder tiempo porque el tiempo de espera es en realidad 4ms
    x = 7;
    

    Ahora, la función foo toma el valor inicial de x como argumento, que se muestra cuando se ejecuta la función.

Comments are closed.