首先说明一下,这里的区别更多的指的是在变量提升方面的区别
1 var声明的变量
console.log(a) // undefined
var a = 10
第一步,create a
第二步,initialized a -> 将a的值初始化为undefined
第三步,执行代码
console.log(a) // undefined
a = 10
2 let声明的变量
console.log(a) // ReferenceError
let a = 10
a = 20
第一步,create a
第二步,执行console.log(a),由于此时a还未被初始化,a存在于暂时性死区里面,所以无法使用,所以会报ReferenceError错误
// 由于上一步报错,此后的步骤不会执行
第三步,初始化a并赋值,a = 10
第四步,重新赋值,将20重新赋值给a
3 const声明的变量
console.log(a) // ReferenceError
const a = 10
a = 20 // TypeError: Assignment to constant variable.
第一步,create a
第二步,执行console.log(a),由于此时a还未被初始化,a存在于暂时性死区里面,所以无法使用,所以会报ReferenceError错误
// 由于上一步报错,此后的步骤不会执行
第三步,初始化a并赋值,a = 10(const声明的变量必须且只能被赋值一次)
第四步,报错// TypeError: Assignment to constant variable.
4 function声明的变量
fn()
function fn() {
console.log(3)
}
第一步,create fn
第二步,初始化并赋值 fn = function(){console.log(3)}
第三步,执行fn() // 打印3
再回过头讨论他们在变量提升方面的区别
之前一直以为,let, const不会有变量提示,其实let和const都会有变量提升,只不过与var比较,
- let,const的创建阶段被提升
- var的创建阶段和初始化阶段被提升
- function将创建阶段,初始化阶段,赋值阶段都提示
再结合以上代码得出
我的理解:
未被初始化的变量会进入暂时性死区,无法使用,而暂时死区可以理解为变量创建阶段后和初始化之前这段时区