1、let命令
基本用法
用來聲明變量,類似于var,但是所聲明的變量只在let命令所在的代碼塊內(nèi)有效。
for循環(huán)中適合使用let:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();//6,如果用var聲明i,輸出會(huì)是10。
不存在變量提升
let命令不會(huì)提升聲明,即先使用后聲明不會(huì)返回undefined,會(huì)直接報(bào)錯(cuò)。
// var 的情況
console.log(a); // 輸出undefined
var a= 2;
// let 的情況
console.log(a); // 報(bào)錯(cuò)
let a= 2;
暫時(shí)性死區(qū)
當(dāng)前作用域存在let命令時(shí),其聲明的變量將綁定這個(gè)區(qū)域,不受外部影響,即必須要在聲明之后,才能使用此變量,即使它在外部已聲明過。
任何在聲明語句執(zhí)行結(jié)束前的使用都會(huì)報(bào)錯(cuò),包括typeof檢測(cè)。
其本質(zhì)是:只要進(jìn)入當(dāng)前作用域,所有變量就已存在,但不可獲取,只有當(dāng)聲明變量那行代碼執(zhí)行完畢,才可獲取和使用。
a=1; // 報(bào)錯(cuò)
let a;
typeof a; // 報(bào)錯(cuò)
let a; //如果使用的是var,上一行代碼會(huì)返回undefined
不允許重復(fù)聲明
let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量。
// 報(bào)錯(cuò)
function () {
let a = 10;
var a = 1;
}
// 報(bào)錯(cuò)
function () {
let a = 10;
let a = 1;
}
2、塊級(jí)作用域
ES6 的塊級(jí)作用域
let實(shí)際上為JavaScript新增了塊級(jí)作用域
function fun() {
let a = 5;
if (true) {
let a = 10;
}
console.log(a); // 5
}
塊級(jí)作用域的出現(xiàn),讓立即執(zhí)行行數(shù)表達(dá)式可以簡(jiǎn)化:
(function () {
var a = ...;
...
}());
//簡(jiǎn)化為:
{
let a = ...;
...
}
塊級(jí)作用域與函數(shù)聲明
在塊級(jí)作用域內(nèi),應(yīng)盡量避免聲明函數(shù),若必須聲明,則應(yīng)該寫成行數(shù)表達(dá)式,而不是函數(shù)聲明,因?yàn)楹瘮?shù)聲明會(huì)被提升到塊級(jí)作用域的頭部。
(function () {
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
//因?yàn)楹瘮?shù)聲明提升,上述代碼在ES6中實(shí)際相當(dāng)于:
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();//此時(shí)f不是一個(gè)函數(shù),會(huì)報(bào)錯(cuò)。
}());
3、const命令
基本用法
const命令聲明的是一個(gè)常量,一旦聲明,就不允許改變。
所以聲明時(shí)必須初始化,只聲明不賦值的const命令會(huì)報(bào)錯(cuò)。
const聲明與let相似:
- 不提升變量。
- 存在暫時(shí)性死區(qū)。
- 只在聲明后使用。
- 只在塊級(jí)作用域內(nèi)有效。
- 不可重復(fù)聲明。
const命令聲明對(duì)象時(shí),此對(duì)象的屬性的值依然可改變,對(duì)象本身不可改為新對(duì)象,聲明數(shù)組時(shí)同理。
const obj= {};
// 為 obj 添加一個(gè)屬性,可以成功
obj.pro = 123;
obj.pro // 123
// 將 obj 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò)
obj= {};
const a = [];
a.push('Hello'); // 可執(zhí)行
a.length = 0; // 可執(zhí)行
a = ['world']; // 報(bào)錯(cuò)
4、頂層對(duì)象的屬性
瀏覽器環(huán)境下頂層對(duì)象是指window對(duì)象。
var、function聲明的全局變量是window對(duì)象的屬性,let、const、class聲明的變量則不是。