for循环当中的 var let区别
首先要了解这里代码执行顺序:
for循环同步;setTimeout异步;
js在执行代码的过程中,碰到同步代码会依次执行,碰到异步代码就会将其放入任务队列中进行等待,当同步代码执行完毕后再开始执行异步代码;
然后看下面:
let声明 for(let i=1; i<=5; i++){ setTimeout(function(){console.log(i)}) } // 1 2 3 4 5
let 是块级作用域,一个{} 就是一个区块,而且在每一块内部都不能有重复声明的变量
上面这个循环遍历执行了5次,相当于有五个块作用域,每个块作用域里面的都定义了一个叫 i 的变量。值分别是1 2 3 4 5
所以最后执行setTimeout的时候会从当前作用域(块作用域)内寻找变量 i ,所以最终结果是1 2 3 4 5
var声明 for(var i=1; i<=5; i++){ setTimeout(function(){console.log(i)}) } // 6 6 6 6 6
var是函数作用域可以重复声明并覆盖值,在当前这个作用域下,变量 i 在循环结束后值更新为6,再执行setTimeout时,setTimeout所在的作用域里 i 已经是6了。