let和const的出现,总感觉是为了开发的代码规范而出现的。我们要逐渐放弃使用var,在项目中多使用let和const,他们与var的区别在于:
1,var有变量提升,有初始化提升,值是可变的,没有块级作用域的概念,如果想搞出来一个保护内部变量的方法,可以使用闭包。
2,let有变量提升,没有初始化提升,值是可变的,存在块级作用域。
3,const有变量提升,没有初始化提升,值是不可变的,但是如果定义的是对象,则属性可变,存在块级作用域。
let和const因为暂时性死区的存在,使得没有初始化提升。
暂时性死区:创建了变量但是没有初始化,没法使用变量,“Cannot access ‘value’ before initialization”
function fn () {
console.log(name)
let name = '张三'
}
fn() // Cannot access 'name' before initializat
块级作用域解决问题:
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
})
} // 5 5 5 5 5
for(let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
})
} // 0 1 2 3 4