var在ECMAS的所有版本中都能使用,而let和const只能在ECMAScript6及更晚版本中使用。
var:
①声明范围:函数作用域
在函数外调用会报错
全局声明var时,声明的变量会成为windos对象的属性
②声明的提升:
var的声明会提升到函数顶部,但赋值不会。此时变量为undefined
此段代码等价于
③var可以重复声明同一个变量
④for循环中的var
let:
①声明范围:块作用域
函数作用域范围 大于 块作用域范围,所以限制var的条件同样也能限制let。也就是说let的有更明确的作用域、声明位置。
全局声明let时,声明的变量不会成为windos对象的属性。
②let声明不会被提升
③let不能重复定义同一变量
④for循环中的let
const:
const与let基本一致,区别是用const声明时,必须同时初始化变量,且不能修改该变量
总结:
var与const的区别:①var声明的范围为函数作用域,let声明的范围为块作用域;②var的声明会被提升,let的声明不会被提升;③var可以重复声明同一变量,let不可以重复声明同一变量;④在for循环的表现中有差别,见上文。
最佳实践:
为了有更明确的作用域、声明位置、不变的值
应当尽量用const,当明确未来会修改变量时用let,而不使用var。