JS中for循环和定时器的小问题

for (var j = 0; j < 5; j++) {
            setTimeout(function() {
                console.log(j)
            }, 1000 * j)
        }

setTimeout是异步执行的,1000毫秒后向任务队列里添加一个任务,只有主线上的全部执行完才会执行任务队列里的任务,所以当主线程for循环执行完之后 i 的值为5,这个时候再去任务队列中执行任务,i全部为5;

每次for循环的时候setTimeout都会执行,但是里面的function则不会执行被放入任务队列,因此放了5次;for循环的5次执行完之后不到1000毫秒;

1000毫秒后全部执行任务队列中的函数,所以就是输出五个5啦

假如把var换成let,那么输出结果为0,1,2,3,4;

因为let i 的是区块变量,每个i只能存活到大括号结束,并不会把后面的for循环的 i 值赋给前面的setTimeout中的i;而var i 则是局部变量,这个 i 的生命周期不受for循环的大括号限制;

原文地址:https://www.cnblogs.com/kawayi/p/14425600.html