var的for循环在js代码中,我们在使用for循环的时候,需要定义和使用一个变量,而在使用var关键字定义的时候,难免会出现一些问题:当我们使用var关键字定义变量时,会发生变量提升,就像注释中写的一样,导致setTimeout中的i始终是相同的数据。而这里的setTimeout并不会立即执行,它们会被加入到一个任务栈中。同时for循环是同步的,而setTimeout是异步的。直到同步方法执行完毕,异步方法才会开始执行。结果,当i的值已经变成9的时候,setTimeout还没有开始执行。它会导致console.log在10setTimeouts中输出9。让我们for循环,当我们在for循环中使用let声明变量时,这不会发生:for(leti=0;i<10;i++){setTimeout(()=>{console.log(i)},2000)}let声明的作用域会变成块级作用域,也就是说每次setTimeout中i的值是不同的,也就是指向不同的i,那么会输出0,1,2,3,4,5,6,7,8,9依次
