以下代码执行后,5 秒后内控制台输出的信息是?
for(var i = 0; i < 5; i++){
setTimeout(function(){
console.log(i);
}, 1000 * i);
}
5 5 5 5 5
将for循环的var换成let后,输出就会变成0 1 2 3 4
在所有同步任务执行完之前,任何的异步任务是不会执行的。 而setTimeout就是一个异步任务,所以会先执行for循环这个同步任务,把setTimeout()放进任务队列中等待主线程的for循环执行完毕,一旦"执行栈"中的所有同步任务执行完毕(循环结束后此时i=5)就会从队列中取出setTimeout()
将for循环的var换成let后,输出就会变成0 1 2 3 4
本文探讨了JavaScript中使用setTimeout定时器与for循环结合时出现的闭包问题,通过对比var与let关键字的不同表现,解释了作用域链与块级作用域的区别。
1126

被折叠的 条评论
为什么被折叠?



