閱讀《ES6標(biāo)準(zhǔn)入門》(第三版)? 阮一峰著 的筆記
Chapter2. let 和 const命令
目錄結(jié)構(gòu)? ? ? ? ? ? ?2.1 let命令
? ? ? ? ? ? ? ? ? ? ? ? ? ?2.2 塊級作用域
? ? ? ? ? ? ? ? ? ? ? ? ? ?2.3 const命令
2.1 let命令
2.1.1 基本用法
let所聲明的變量只在let命令所在的代碼塊中有用。
for循環(huán)中的計數(shù)器就很適合使用let:? ?for(let i=0; i<10; i++){ }? ?i只在for循環(huán)體中有用。
eg: 若使用var
? ? ? ?var a =[ ];
? ? ? ?for(var i=0; i<10; i++) {
? ? ? ? ? ?a[i] = function () {
? ? ? ? ? ? ? ?console.log(i);
? ? ? ? ? ?};
? ? ? ?}
? ? ? ?a[6]();? ? ??//輸出10
解釋:
上述代碼中i是var聲明的,全局變量中有效,所以全局中只有1個i,被賦值給數(shù)組a的每一個log(i)中的i都指向同一個全局i,導(dǎo)致輸出的是運(yùn)行完最后一輪的i值(10)。
若使用let,則會輸出6。每輪循環(huán)的i都是一個新的變量。
2.1.2 不存在變量提升
var的變量提升現(xiàn)象:變量可以在聲明之前使用,值為undefined。
let不存在該現(xiàn)象:即變量必須在聲明之后使用,否則會報錯。
eg:
//使用var
console.log(a);? ? ?//輸出undefined
var a = 2;??
//使用let
console.log(b);? ? ?//輸出ReferenceError? , b是不存在的。
var b = 2;
2.1.3 暫時性死區(qū)
暫時性死區(qū)(TDZ): 代碼塊內(nèi),使用let命令聲明變量前,該變量都是不可用的。
if(true){? ? ? ? ? ? ? ? ? ?//TDZ開始
? ? tmp = 'abc';? ? ? ? ? ? //ReferenceError?
? ? console.log(tmp);? ?//ReferenceError
? ? let tmp;? ? ? ? ? ? ? ? ? ?//let聲明,TDZ結(jié)束
? ? console.log(tmp);? ?//undefined
? ? tmp = 123;? ? ? ? ? ? ?
? ? console.log(tmp);? ?//123
}
隱蔽的死區(qū):
function bar(x = y, y = 2) {
? ? ?return [x,y];
}
bar();? ?//報錯 x=y, 而y還未聲明,屬于死區(qū)
另外:
var x = x; //不報錯
let x = x; //報錯,也是TDZ
暫時性死區(qū)的本質(zhì)是:進(jìn)入當(dāng)前作用域,所要使用的變量已經(jīng)存在,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用變量。
2.1.4 不允許重復(fù)聲明
let不允許在相同作用域內(nèi)重復(fù)聲明同一個變量。
eg1:?
function() {
? ? let a = 10;
? ? var a = 1;
}? ?//報錯
eg2:
function() {
? ? let a = 10;
? ? let a = 1;
}? ?//報錯
eg3:
function func(arg) {
? ? let arg; //報錯
}
eg4:?
function func(arg) {
? ? {
? ? ? ? let arg; //不報錯
? ? }
}
未完待續(xù)