本文详细探讨了在ES6中使用for循环时let和var关键字之间的区别。通过具体的例子解析了它们作用域的不同以及由此带来的影响。
`let` 和 `var` 的区别:
使用 `var i = 0;` 的循环代码:
```javascript
for(var i=0;i<5 xss=removed>{
console.log(i); // 输出五个数字,但每个都是5
},100)
}
console.log(i); // 输出5
```
在外部尝试访问变量i时输出为5。
使用 `let j = 0;` 的循环代码:
```javascript
for(let j=0;j<5 xss=removed>{
console.log(j); // 正确地输出了数字序列:0,1,2,3,4
},100)
}
console.log(j); // 报错,提示j未定义。
```
为什么使用 `let` 可以正确显示结果而用 `var` 就不可以呢?
原因在于变量声明的提升机制和作用域的不同。`var` 声明的变量在整个函数中都是可以访问到的,并且在全局作用域下是可被引用的,所以在循环结束后仍然能读取其值为5。
然而,在使用 `let` 时,它具有块级作用域(即只在其声明所在的代码块内有效),因此当尝试在外层环境中直接调用变量 j 的时候会引发错误。