一.let
ES6 新增了 let 命令,用來聲明變量。它的用法類似于 var,但是所聲明的變量,只在 let 命令所在的代碼塊內(nèi)有效。
1. 變量名不能重復(fù)
- let 聲明的變量,變量名不能重復(fù)! 而且必須先聲明后使用。
- 換句話說,let 沒有變量的提升 和 變量的污染。
var a = 0;
let a = 1; // 報(bào)錯(cuò) --- 標(biāo)識(shí)符 'a' 已經(jīng)聲明
console.log(a);
2. 塊級(jí)作用域
- 塊級(jí)作用域,相當(dāng)于局部作用域。
- 在JS中,只有函數(shù)才能創(chuàng)造一個(gè)局部作用域,
- 但是在ES6中,只要是個(gè) { } 都是塊級(jí)作用域(局部作用域)。
// 對(duì)象:
{
var a = 1;
let b = 2;
}
console.log(a); // a = 1
console.log(b); // 報(bào)錯(cuò) --- b is not defined
// 在 js 中函數(shù)創(chuàng)造局部環(huán)境
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 聲明的變量只能在當(dāng)前作用域使用
- js5 中 用 var 在 for 中聲明的變量,可以再外部訪問。
- es6中 用 let 在 for 中聲明的變量 ,無法在外部訪問。
- 在 js 中,全局變量可以在局部環(huán)境下使用,局部變量不能在全局下使用。
- 在 es6 中,let 聲明的變量,全局變量只能在全局使用,局部變量只能在局部使用。
而且全局聲明的變量與局部聲明的變量沒有任何關(guān)系, 變量名都可以一樣。
let a = 0; // 全局作用域
{
// console.log(a); // 報(bào)錯(cuò) --- 在初始化之前無法訪問'a' 應(yīng)該先聲明后使用。
let a = 1; // 局部作用域
console.log(a); // 1
{
let a = 2; // 局部作用域
console.log(a); // 2
}
}
console.log(a); // 0
4. 暫時(shí)性死區(qū)
- 如果區(qū)塊中存在 let 和 const 命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。
- 總之,在代碼塊內(nèi),使用 let 命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時(shí)性死區(qū)”
{
console.log(a); // 報(bào)錯(cuò) --- 在初始化之前無法訪問'a' 應(yīng)該先聲明后使用。
let a = 1; // 局部作用域
console.log(a); // 1
}
二. const
1.const關(guān)鍵字
- 在ES6中用來聲明靜態(tài)常量。
- 常量在聲明時(shí),所有字母必須大寫, 必須賦值。
- 一旦聲明,常量的值就不能改變。
const PI = 3.1415926;
console.log(PI);
PI = 0;
console.log(PI); // 報(bào)錯(cuò) --- 常量無法修改, 對(duì)常數(shù)變量的賦值。
const ABC;
console.log(ABC); // 報(bào)錯(cuò) --- 在const聲明中缺少初始化格
2. const 在作用域特性上與 let 完全一致
三. 總結(jié):
1. const 的作用域與 let 命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。
2. const 與 let 都 沒有提升和污染(變量 / 常量)。
3. const 與 let 都 存在暫時(shí)性死區(qū)。
4. const 與 let 都 只能在聲明的位置后面使用。
5. const 與 let 都 不可重復(fù)聲明。
區(qū)別:
let => 變量:值可以改變。
const => 常量: 一旦聲明,變量值不可更改。