前言
ES 2015 之后新增了一種作用域---塊級作用域
下面用到的 let const 都是在塊級作用域里生效的
例如:
{
let a = 10;
var b = 1;
}
a; // ReferenceError: a is not defined.
b; // 1
let 命令
| 序號 | 特點 | 介紹 |
|---|---|---|
| 1 | 塊級作用域內(nèi)生效 | 代碼塊{} 內(nèi)聲明的變量只能在{}內(nèi)使用,出去了就沒有了 |
| 2 | 不存在變量提升 | 所有變量必須先聲明后使用,否則報錯 |
| 3 | 暫時性鎖區(qū) | 只要塊級作用域內(nèi)存在 let 命令,它所聲明的變量就“綁定”(binding)這個區(qū)域,不再受外部的影響。 |
| 4 | 不允許重復(fù)聲明 | let 不允許在相同作用域內(nèi),重復(fù)聲明同一個變量。 |
例子
1.塊級作用域內(nèi)生效
{
let a = 10;
var b = 1;
}
a; // ReferenceError: a is not defined.
b; // 1
2.不存在變量提升
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
3.暫時性鎖區(qū)
if (true) {
// TDZ開始
tmp = "abc"; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ結(jié)束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
4.不允許重復(fù)聲明
// 報錯
function func() {
let a = 10;
var a = 1;
}
// 報錯
function func() {
let a = 10;
let a = 1;
}
function func(arg) {
let arg; // 報錯
}
function func(arg) {
{
let arg; // 不報錯
}
}
const 命令
基本用法
const 聲明一個只讀的常量。一旦聲明,常量的值就不能改變
特別提示
const 實際上保證的,并不是變量的值不得改動,而是變量指向的那個內(nèi)存地址所保存的數(shù)據(jù)不得改動。對于簡單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個內(nèi)存地址,因此等同于常量。但對于復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個指向?qū)嶋H數(shù)據(jù)的指針,const 只能保證這個指針是固定的(即總是指向另一個固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
特點
let 具有的特點 const 同樣也具有
| 序號 | 特點 | 解釋 |
|---|---|---|
| 1 | 聲明之后不能修改變量的值 | 見特別提示 |
| 2 | 聲明之后必須初始化 | 特點 1 決定的 |
例子
1.聲明之后不能修改變量的值
const PI = 3.1415;
PI; // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
2.聲明之后必須初始化
const foo;
// SyntaxError: Missing initializer in const declaration
3.聲明的是個引用類型
const obj = { a: 15 };
obj.a = 16;
obj.a; // 16
ES6 聲明變量的六種方法
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 名稱 | var | function | let | const | import | class |