变量是一个用于保存任意值的命名占位符,用来存储及操作内存中的值。通过var、let、const声明。
let varName = 'hi';let var1 = 1,var2 = 2
声明差异
var声明
- 全局环境下,声明的变量,会称为window对象的属性
- 没有块级作用域
- 会声明提升
let声明
- 有块级作用域
- 不允许重复声明相同变量
- 不会声明提升,存在暂时性死区
const声明
- 与let基本相同
- 在声明时必须完成初始化
- 变量的值不可更改
let的for循环
渗透外部
使用var时,for循环定义的迭代变量会渗透到外部
for (var i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // 5
- 因为var不存在块级作用域,因此该迭代变量就向外渗透了
- 而let不会产生这个问题,迭代只会在循环体中生效
块级作用域
像下列代码,因为var和异步的问题,会导致行为和预想不一致
for (var i = 0; i < 5; ++i) {
var index = i
setTimeout(() => console.log(index), 0)
}
- 全都会打印4,因为var没有块级作用域,因此每次循环操作的都是同一个index变量
- ES6之前需要通过闭包解决,但使用let之后,每次声明的index都是块内单独的,直接解决了这个问题
- JS引擎再 for 循环时,每一次循环都会创建一个独立的变量实例,因此也可以不用额外的 index 保存
- 等于每次循环时,都创建了一个独立的块级变量 i
