var:
- 不存在块级作用域,if else 中的 {} 中用var定义的变量,{} 外也能使用,但存在函数作用域。
- 存在变量提升,即var定义的变量有声明和赋值两个步骤,声明会被提升到当前作用域的顶层且会被赋值为undefined,在声明和赋值的中间过程,访问变量会得到undefined,不会报错。
- 全局作用域中var定义的变量实际是挂在了window下。
- 允许重复声明
let:
- 存在块级作用域 {}
- 不存在变量提升,有暂时性死区这个概念。可以理解为let定义的变量也存在声明和赋值两个步骤,但不会被赋值为undefined,在声明和赋值的中间过程,访问变量会报错。
- 不允许重复声明
const
- 与let类似,有以下两点不同
- 声明时必须赋值,否则会报错
- 赋值后,如果是基本数据类型,则不可更改,如果是引用类型,则数据可以更改,但地址不可更改。