- 基本用法
- 块级作用域
基本用法
1.let所声明的变量只在let命令所在的代码块内有效。
2.let、const不存在变量提升
3.暂时性死区。例:
var tem = 123
if (true) {
tem = 'abc'
let tem
}
上述代码会报错,因为在大括号中已经用let声明tem,所以这个块级作用域只能有一个tem,而let又没有变量提升,所以在let前写了tem就会报错。
4.不允许重复声明:let不允许在相同作用域内重复声明同一个变量
块级作用域
1.ES5只有全局作用域和函数作用域,没有块级作用域。
2.为什么需要块级作用域,因为很多循环语句中的变量都是全局变量,容易造成全局污染。
3.ES5中的立即执行函数可以模仿块级作
4.ES5规定,函数只能在顶层作用域和函数作用域中声明,不能在块级作用域中声明。ES6允许在块级作用域内声明函数,函数声明会提升到全局作用域或函数作用域、块级作用域(所在作用域)的头部但是大括号不能省略,否则报错。
5.do表达式:块级作用域将语句封装在一起,没有返回值,但是用do表达式就可以,例:
let x = do {
let t = f()
t*t + 1
}
x会获得块级作用域的返回值
const命令
基本用法
const声明一个只读的常量。一旦声明,常量的值就不能改变而且一旦声明必须初始化,例:
const p = 3.14
p = 5 // 报错
const foo // 报错
本质
const实际上保证的不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于基本数据类型,值就保存在变量指向的内存地址中,对于引用数据类型,const声明的变量是指向内存地址的指针。例:
const foo = {}
foo.a = 123
foo.a // 123
foo = {} // 报错
由此可见const声明的变量本身是可变的,但是不能指向另外一个内存地址。
总结:ES5有全局作用域和函数作用域,现在ES6又增加了块级作用域,简单的说就是有{}的代码块都是一个独立的作用域,let、const没有变量提升,但是函数声明还是有函数声明提升。