1.全局作用域
var是全局的变量,let不是全局
2. 块级作用域
在块作用域中两者的区别较为明显, let只在for()循环中可用,而 var是对于包围for循环的整个函数可用
3.重复声明
var的变量名可以重复,let的就不行,当var与let混合使用变量名也不能重复
4.暂时性死区(TDZ)
这个就要提到,var和let其实都是可以变量提升的。
在很多非官方文档中说let是不会提升的,
但是查找MDN我们可以看到两个都是会提升不过提升后有不同的结果。
var提升后在MDN中说了会执行第一,第二两个情况。
let提升后执行的第三种情况,这其实就是暂时性死区。
比如:
console.log(a)
let a = 2;
执行时。let a = 2;会被提升到第一行,
let a = 2;
console.log(a)
let a = 2;
但是在提升后,第一行和声明变量的之间会产生一个暂时性死区,在这个死区里面是不能访问的。也就是说:
let a = 2;
console.log(a)//这一排其实在死区里,所以运行会报错。不能访问a。
let a = 2;