let 块作用域变量
用于变量的声明,用法类似var
,但是let
是代码块作用域。块作用域:指{ }
间的代码的作用域
不存在变量提升
在变量声明之前,使用用let
声明的变量会抛出ReferenceError
。
console.log(bar);//抛出ReferenceError
let bar = 2;
暂时性锁区
只要在块级作用域内用let
声明的变量就绑定这个区域,这个变量就已经存在在当前作用域,但是是不可获取的,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
console.log(tmp);//输出undefined
var tmp = 123;
{
console.log(tmp);//抛出ReferenceError
let tmp;
}
不允许重复声明
let
不允许在相同作用域内,重复声明同一个变量
{
let a = 1;
{
let a = 2;//可以,父子作用域不是相同作用域
}
let a = 3;//不可以
}
const 常量声明
声明一个只读变量,一旦声明,常量的值不能改变。
性质
- 常量的值不能改变
- 只声明不赋值会报错
- 块作用域常量
- 不可重复声明
- 复合类型(对象和数组)只保证常量保存的地址不变
对象冻结
实现对象的完全只读,可以使用Object.freeze(obj)
const foo = Object.freeze({});
注意:Object.freeze本身不会递归冻结对象,即冻结的对象的属性如果还是复合类型,该属性的属性仍然不是只读的
顶层对象的属性
顶层对象在浏览器指的是window对象,在node环境指的是global对象;
ES6规定,var和function声明的全局变量依旧是顶层对象的属性,而let、const和class声明的全局变量不属于顶层对象的属性。