function func2() { for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 2000); } } func2(); Debido al closure , la instrucción console.log debe recordar su entorno léxico externo, que es primero setTimeout y luego el bucle for. Dado que i no está disponible en el contexto setTimeout , busca en el contexto de ejecución del bucle for y busca el valor de i allí.
Ahora, ese valor, después de 2 segundos, debería haber sido 3 para las tres ejecuciones de console.log . Pero muestra la salida como:
0 1 2Ha utilizado let que tiene block scoped por lo que habrá una i separada para cada iteración de bucle for.
1) Si desea generar 3 consecutivos para que pueda declarar i fuera de for-loop , entonces solo habrá i único con el valor 3 .
function func2() { let i; for (i = 0; i < 3; i++) { setTimeout(() => console.log(i), 2000); } } func2(); 2) Si desea el mismo alcance léxico, también puede usar var aquí,
vartiene un alcance de función, por lo que solo habrá unoi
function func2() { for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 2000); } } func2();