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了。

posted @ 2022-08-05 14:45  live丶  阅读(51)  评论(0编辑  收藏  举报