一,let 和 var
1. 作用域
let作用域小,是块级的,且相同作用域内不能出现相同的变量定义。
for循环里的let i,i出了循环就失效了。
var作用域大,是全局或者函数内级别的,且相同作用域内可以出现相同的变量定义(值是后面的覆盖前面的)。
for循环里的var i,i出了循环依然能够被读取。
2. 预处理机制,声明提升
let没有声明提升,js运行到该行语句时才会产生该let变量,也就是说提前使用会报错。
var无论在何处定义,js都会把它的声明提前到函数开始,不过也只是声明提前,赋值不会提前,提前使用值为undefined。
3. let变量默认值不是undefined
let不初始化就打印会报错。
var不初始化打印不报错,默认值为undefined。
二,var和const
var和const的作用域一样,都是代码块级别。
let声明普通变量,不必赋初值,可随时改值。
const声明常量,必须赋初值,不可改值(除非是对象或引用类)