在ES5中,声明变量只有var和function两种形式。但是因为var声明的变量会有一定的缺点,内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量。
ES6提出了使用let和const声明变量,更加安全方便的提供我们声明变量。
var
在ES6以前存在全局作用域和函数作用域两种。没有块级作用域的说法。并且存在变量提升。
let
1.块级作用域 { }
- 作用域只在他所在的代码块
- 一个 { } 可以看作一个作用域
- if语句和 for语句里面的{ }也属于块作用域
2.let 不允许在相同的作用域内,重复声明同一个变量。
3.不存在变量提升
只有用var 声明的变量才会有变量提升,let 和const 都不用考虑
4.脱离顶层作用域
var 声明的变量,可以通过window.变量名的形式使用。
但是用let/const声明的变量不会绑定在顶层作用域window或globle中。
5.暂时性死区 TDZ
TDZ又称暂时性死区,意思是变量在作用域内已经存在,必须在 let / const声明后面使用。
ES6明确规定,如果区块中存在let/const命令,这个区块用这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用的变量,就会报错
TDZ本质:只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
TDZ能够让开发者养成先声明后使用的习惯,让程序更加的稳定。
const
- const 声明一个只读的常量,一旦声明,常量值就不可以改变。所以const一旦声明就必须立即初始化。
- 只声明,不赋值,会报错(注意:var let 只声明不赋值 : undefined)
- 不能重新赋值const定义的值,但是可以修改const’声明的对象类型。
- const 的作用域与let命令相同,只在声明所在的块级作用域内有效
- const声明的变量也不存在变量提升,同样存在暂时性死区,只能在声明位置的后面使用
- const声明的常量和let一样不可重复声明