一、let
所声明变量只在所在的代码块中有效
- 不存在变量提升
typeof x; //ReferenceError
let x; - 暂时性死区
ES6明确规定如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前使用这些变量,就会报错。
var tmp = 123;
if (true) {
tmp = 'abc'; //ReferenceError
let tmp;
}
- 不允许在相同的作用域中重复声明
function (){
let a = 1;
let a = 2;
} // 报错
ES6的块级作用域一方面可以避免内层变量可能覆盖外层变量,另一方面可以避免用来计数的循环变量泄漏为全局变量;
二、const
一旦使用const声明,其值就不能再改变,所以声明后必须立即初始化,不能留到以后赋值
与let一样,拥有块级作用域
不存在变量提升,同样存在暂时性死区
-
对于复合类型,变量名不指向数据,而是指向数据所在的地址
const foo = {}; foo.prop = 123; // ok foo = {prop:123}; // typeError: 'foo' is read-only
真的想冻结一个对象,使用
Object.freeze()
6种声明变量方法:
var
,function
,let
,const
,import
,class