1.let命令
1.1塊級作用域:
和var類似但是只在let聲明變量的代碼塊內(nèi)有效臣咖。例如for循環(huán)婚苹,每次循環(huán)都是不同的代碼塊昧廷,所以let聲明的變量在每次循環(huán)中都只在當前循環(huán)中起作用呵萨。
for(vari =0;i <5;i++) {
setTimeout(function() {
console.log(i)
},i *1000)
}輸出5次5
解決方法很煩,用閉包
for(vari =0;i <5;i++) {
(function(i) {
returnsetTimeout(function() {
console.log(i)
},i*1000)
}(i))
}
for(leti=0;i<5;i++){
setTimeout(function() {
console.log(i);
},i*1000)
}利用let定義變量的塊級作用域很簡單福压,所以let很適合for
1.2不存在變量提升
以前在var聲明變量前面我們使用變量,變量值是undefined或舞,不會報錯荆姆,因為變量提升。
但是用let聲明變量的話映凳,不存在變量提升胆筒,在聲明前使用變量會報錯
// var 的情況
console.log(foo);// 輸出undefined
varfoo=2;
// let 的情況
console.log(bar);// 報錯ReferenceError
let bar=2;
1.3暫時性死區(qū)
暫時性死區(qū)的本質(zhì)就是,只要一進入當前作用域诈豌,所要使用的變量就已經(jīng)存在了仆救,但是不可獲取抒和,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量彤蔽。
說明:
只要在塊級作用域內(nèi)用let聲明了一個變量摧莽,那么let聲明的這個變量就相當與綁定了這個塊,你在這個塊外部定義的同名變量(包括全局)铆惑,要想在這個塊里操作這個變量范嘱,都必須得在let聲明后使用,否則就會報錯员魏。
就連這樣都會報錯:(因為在使用變量x的時候丑蛤,x還沒有聲明完)
// 不報錯
varx=x;
// 報錯
let x=x; // ReferenceError: x is not defined
1.4不允許在同一個塊中重復定義同一個變量,會報錯撕阎。
1.5在全局下聲明的全局對象不再是window頂層對象的屬性了受裹。
1.6支持解構(gòu)賦值
以前,為變量賦值虏束,只能直接指定值棉饶。
let a=1;let b=2;let c=3;
ES6允許寫成下面這樣。
let[a,b,c]=[1,2,3];
1.7do 表達式
本質(zhì)上镇匀,塊級作用域是一個語句照藻,將多個操作封裝在一起,沒有返回值汗侵。
{lett=f();t=t*t+1;}
上面代碼中幸缕,塊級作用域?qū)蓚€語句封裝在一起。但是晰韵,在塊級作用域以外发乔,沒有辦法得到t的值,因為塊級作用域不返回值雪猪,除非t是全局變量栏尚。
現(xiàn)在有一個提案,使得塊級作用域可以變?yōu)楸磉_式只恨,也就是說可以返回值译仗,辦法就是在塊級作用域之前加上do,使它變?yōu)閐o表達式坤次。
letx=do{lett=f();t*t+1;};
上面代碼中古劲,變量x會得到整個塊級作用域的返回值。