- var关键字
- var声明作用域
- var变量提升
- let声明
- let声明的范围是块作用域,而var声明的范围是函数作用域
- 暂时性死区 let声明的变量不会在作用域中被提升
- 全局声明 var声明的变量会变成window对象的属性,而let不会
- 条件声明 let不能依赖条件声明模式
- for循环中的let声明,var声明循环定义的迭代变量会渗透到函数体外部,而let不会。
- const声明
- const声明变量时必须同时初始化变量,而且尝试修改const声明的变量会导致运行时错误。(不能用const声明循环的迭代变量)
- 由于const声明暗示变量的值是单一类型且不可修改,JavaScript运行时编译器可以将其所有实例都替换成实际的值,而不会通过查询表进行变量查找。谷歌的V8引擎就执行这种优化。(开发实践表明,如果开发流程并不会因此而受很大影响,就该尽可能多使用const声明,除非确实需要一个将来会重新赋值的变量。这样可以从根本上保证提前发现重新赋值导致的bug。)
es6增加let和const之后不推荐使用var,其次const优先,let次之。