var:变量可以多次声明
let:变量只能声明一次
var存在的两个bug
JS没有块级作用域
通过var声明的变量,其作用域是函数的全部
循环内变量会过度共享
意思就是说在循环内部定义的变量,在循环外部依旧可以访问
let存在的意义
let声明的变量拥有块级作用域
let声明的变量其作用域只是外层块,而不是外层函数
let声明的全局变量不是全局对象的属性
通过let声明的全局变量无法通过window.变量名进行访问,其只存在于一个相对的作用域中
形如 for(let x in data) 的循环在每次迭代时都会为 x 创建新的绑定
let声明的变量无法重新被定义
let变量在声明前无法被调用
这个比较基于花括号包裹的作用域中声明了变量name ,所以JS编译器会根据ES6规定的 变量在声明之前无法使用 抛出错误
var声明的变量可以被使用是因为存在 变量提升
if (true) {
name = 'abc' // name is no defined
let name
}
if (true) {
name = 'abc'
console.log(name) // abc
var name
}
const的作用
const就是用于定义常量的,常量(不会改变的变量)有以下特点
声明时必须赋值
赋值后不可以改变
1 const 和 let 具有块级作用域
外层作用域无法读取内层作用域的变量
2 const 和 let 不会进行声明提升
只能在声明的位置后使用
3 . const 和 let 不允许在相同的作用域里面重复声明
4. const 和 let 定义的变量/常量不能和函数重名
5. const 和 let 定义的变量/常量不属于window对象
顶层对象的属性与全局变量挂钩,被认为是JavaScript语言最大的设计败笔之一。即: window既值浏览器窗口,又表示顶层对象。
ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
6. const 声明的是只读的常量
声明后不能被修改
总结:
默认情况下应该使用const,只有知道变量需要被改变时才使用let,这样预期外的改动都可以算作是bug处理。