1.变量的声明
ES6 新增了 let 命令,用来声明变量。它的用法类似于 var,但是所声明的变量,只在 let 命令所在的代码块内有效。
1. 变量名不能重复
- let 声明的变量,变量名不能重复! 而且必须先声明后使用。
- 换句话说,let 没有变量的提升 和 变量的污染。
var a = 0;
let a = 1; // 报错 --- 标识符 'a' 已经声明
console.log(a);
2. 块级作用域
- 块级作用域,相当于局部作用域。
- 在JS中,只有函数才能创造一个局部作用域,
- 但是在ES6中,只要是个 { } 都是块级作用域(局部作用域)。
// 对象:
{
var a = 1;
let b = 2;
}
console.log(a); // a = 1
console.log(b); // 报错 --- b is not defined
// 在 js 中函数创造局部环境
for (var i = 0; i < 10; i++) {
var a = i;
}
console.log(i); // 10
console.log(a); // 9
// es6 中 用 let 在 for 中声明的变量 ,无法在外部访问。
for (let i = 0; i < 10; i++) {
let a = i;
}
console.log(i); // i is not defined
console.log(a); // i is not defined
3. let 声明的变量只能在当前作用域使用
- js5 中 用 var 在 for 中声明的变量,可以再外部访问。
- es6中 用 let 在 for 中声明的变量 ,无法在外部访问。
- 在 js 中,全局变量可以在局部环境下使用,局部变量不能在全局下使用。
- 在 es6 中,let 声明的变量,全局变量只能在全局使用,局部变量只能在局部使用。
而且全局声明的变量与局部声明的变量没有任何关系, 变量名都可以一样。
let a = 0; // 全局作用域
{
// console.log(a); // 报错 --- 在初始化之前无法访问'a' 应该先声明后使用。
let a = 1; // 局部作用域
console.log(a); // 1
{
let a = 2; // 局部作用域
console.log(a); // 2
}
}
console.log(a); // 0
4. 暂时性死区
- 如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
- 总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
{
console.log(a); // 报错 --- 在初始化之前无法访问'a' 应该先声明后使用。
let a = 1; // 局部作用域
console.log(a); // 1
2. const
1.const关键字
- 在ES6中用来声明静态常量。
- 常量在声明时,所有字母必须大写, 必须赋值。
- 一旦声明,常量的值就不能改变。
const PI = 3.1415926;
console.log(PI);
PI = 0;
console.log(PI); // 报错 --- 常量无法修改, 对常数变量的赋值。
const ABC;
console.log(ABC); // 报错 --- 在const声明中缺少初始化格
2. const 在作用域特性上与 let 完全一致
3. 总结:
相同点:
1. const 的作用域与 let 命令相同:只在声明所在的块级作用域内有效。
2. const 与 let 都 没有提升和污染(变量 / 常量)。
3. const 与 let 都 存在暂时性死区。
4. const 与 let 都 只能在声明的位置后面使用。
5. const 与 let 都 不可重复声明。
区别:
let => 变量:值可以改变。
const => 常量: 一旦声明,变量值不可更改。