var & let & const
var
有变量提升
函数作用域内有效
声明的变量会成为 window 对象的属性
let
没有变量提升
仅在块作用域内有效 {}
声明的变量 不会 成为 window 的属性
for(var i=0; i<3; i++) {
setTimeout(() => { console.log(i) }, 1000) // 3 3 3
}
for(let i=0; i<3; i++) {
setTimeout(() => { console.log(i) }, 1000) // 0 1 2
}
/*
var 声明的变量,作用域在全局,定时器每次引用的都是同一个地址的值的递增和,当定时器获取 i 的值时,
i 的值已经叠加到循环结束;
let 声明的变量,作用域在块中,每次处理,都会初始化一个新的值,定时器引用的不是同一个地址的值,
所以没有出现同一个值递增到结束循环的情况
*/
const
与 let 相似,但声明的值是一个常量,不能迭代。
let arr = [2,4]
for(const i of arr) { // for of 用来获取数组的值
console.log(i) // 2 , 4
}
for-of , for-in 的每次迭代,都创建了一个新的对象,const 特别适合这种使用场景