[toc]
### 使用let声明变量
1. 使用let声明的变量不会挂载到全局对象,不会污染全局变量
2. let声明的变量,不允许在当前作用域内再次重复声明。
3. 使用let声明的变量不会再有变量提升,所以在声明变量之前不能使用这个变量。
> ES6不仅引入了let关键字用来解决变量声明的问题,同时还引入了块级作用域的概念。
### 什么是块级作用域
代码执行过程中,遇到大括号时就会创建一个块级作用域。当大括号的代码执行结束后,块级作用域自动销毁。
在块级作用域中用let定义的变量,在其作用域外不能访问。(块级作用域里面可以使用外面的变量,外面的不能使用块级作用域里的变量)
块级作用域与上级作用域或全局作用域有相同名称的变量时,优先使用自己作用域内的变量。
### 关于let声明循环变量相关知识
1. 在for循环中,使用let声明的循环条件变量会进行特殊处理。每次执行循环体都会开启一个新的作用域,并将当前的循环变量绑定到该作用域。相当于每次循环使用的是一个全新的循环变量。
2. 在循环中使用的let声明的循环变量,在循环结束后会销毁。
### 使用const声明常量
1. const和let在用法和作用域上几乎相同。唯一的区别是const声明的变量必须在声明时赋值,且不可以重新赋值。
2. 通常const定义的变量一般是不可变的,例如const PI = Math().PI;,所以将这种变量称为常量。
### 常量声明的相关细节
一、 常量声明锁定的是内存空间,并不锁定内存空间中的地址指向的其它空间。就是说如果常量声明的是一个绝对值,如一个数字,一个字符串等,那么其不可被重新赋值。如果声明的是一个引用值,如一个对象,一个数组,那么该常量不可被重新赋值,但其对像内的属性的值可以被更改。
二、 常量的命名:
1. 通常情况下,可以明确知道该值是不可变的,如圆周率等,**该常量名称采用字母全部大写,若由多个单词组成,单词间采用下划线连接**。
2. 不确定是否可变的常量,还延用正常的定义习惯,采用小驼峰方式定义。
三、 在for循环中,循环变量不能使用常量来定义。但在for in循环中可以使用const来定义循环变量。