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

es6增加let和const之后不推荐使用var,其次const优先,let次之。