`ES6 `新增了`let`命令,用来声明变量。它的用法类似于`var`,但是所声明的变量,只在`let`命令所在的代码块内有效。
### let块级作用域
```js
{
let itbaizhan = 10;
var sxt = 1;
}
itbaizhan // ReferenceError: itbaizhan is not defined.
sxt // 1
```
`for`循环的计数器,就很合适使用`let`命令
```js
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// ReferenceError: i is not defined
```
对比`var`和`let`在循环中的应用
```js
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
```
上面代码,输出的`10`,而我们期待的是`6`
```js
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
```
上面代码,输出的`6`
### let不存在变量提升
`var`命令会发生“变量提升”现象,即变量可以在声明之前使用,值为`undefined`。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用
为了纠正这种现象,`let`命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
```js
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
```
### let不允许重复声明
`let`不允许在相同作用域内,重复声明同一个变量。
```js
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
```
Const 命令
const
声明一个只读的常量。一旦声明,常量的值就不能改变
const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable.
const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值
const foo; // SyntaxError: Missing initializer in const declaration
const
的作用域与let命令相同:只在声明所在的块级作用域内有效
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
const
命令声明的常量也是不存在提升
if (true) { console.log(MAX); // ReferenceError const MAX = 5; }
const
声明的常量,也与let
一样不可重复声明
var message = "Hello!"; let age = 25; // 以下两行都会报错 const message = "Goodbye!"; const age = 30;