var和let的for循环

var的for循环
在js代码中,我们使用for循环时,要定义使用一个变量,而当我们使用var关键字来进行定义的时候,难免会出现一些问题:
var和let的for循环
文章图片

当我们使用var关键字对变量进行定义的时候,将会发生变量提升,就类似于注释里面写的那样,导致setTimeout里面的i一直是同一个数据。
并且这里setTimeout不会被立即执行,它们会加入一个任务栈当中。同时,for循环是一个同步,而setTimeout是一个异步,异步方法要等到同步方法执行完之后才会开始执行,就导致了i的值已经变成了9的时候,setTimeout都还没有开始执行,这就会导致10个setTimeout中console.log都输出9。
let的for循环
而当我们在for循环中使用let声明变量时,将不会出现这种情况:

for(let i=0; i<10; i++) { setTimeout(() => { console.log(i) }, 2000) }

【var和let的for循环】被let声明的作用域将会变成了一个块级作用域,也就是说每个setTimeout里面的i的值是不一样,也就是指向的是不同的i,那么将会依次输出0,1,2,3,4,5,6,7,8,9

    推荐阅读