**出現(xiàn)的時(shí)期 **
var -->ES5
let const -->ES6
塊級(jí)作用域
ES6以前JS以var來(lái)聲明變量晨仑,以function來(lái)區(qū)分作用域藕帜,{}這種無(wú)法限定var的作用域意乓。
ES6出現(xiàn)后樱调,帶來(lái)了塊級(jí)作用域。if届良,for等可以產(chǎn)生一個(gè)花括號(hào)笆凌,花括號(hào)中的語(yǔ)句集合都屬于{塊}
,在塊中定義的變量在塊外是不可見(jiàn)的士葫,我們把從 ' { '
開(kāi)始 ' } '
結(jié)束的這一塊稱(chēng)為塊級(jí)作用域乞而。
在塊級(jí)作用域里,和函數(shù)作用域有相類(lèi)似的地方慢显,那就是當(dāng)函數(shù)調(diào)用完成后爪模,函數(shù)內(nèi)部的變量會(huì)被銷(xiāo)毀欠啤。那么塊級(jí)作用域……請(qǐng)看例子!
function test(){
(function(){
for(var i=0;i<10;i++);
})();
console.log(i);
}
test();
想想看會(huì)輸出什么?結(jié)果是 i
未定義屋灌。為什么呢跪妥?這是因?yàn)閖s的閉包特性,for
語(yǔ)句在閉包內(nèi)声滥,當(dāng)function被調(diào)用結(jié)束后,i被銷(xiāo)毀侦香,所以訪問(wèn)不到落塑。
暫時(shí)性死區(qū)
暫時(shí)性死區(qū)(TDZ)是真正短暫的(基于時(shí)間),和不受空間條件限制的(基于位置)罐韩。
if(true){
const fun = function(){//TDZ begin
console.log(myVar);//OK
}
…
let myVar = 3;//TDZ end
fun();//TDZ 外部
}
變量提升
函數(shù)提升是把后面的變量都提到前面去憾赁。
這個(gè)還是用例子來(lái)說(shuō)
function test(){
console.log(say);
var say = ' Hello ! ' ;
}
不會(huì)報(bào)錯(cuò),輸出undefined散吵;
因?yàn)樽兞刻嵘迹瑫?huì)將上面的變成
function test(){
var say;
console.log(say);
say = ' Hello ! ' ;
}
這個(gè)還是非常好理解的,如果你還在使用ES5的話矾睦,那就在書(shū)寫(xiě)的時(shí)候最好自己手動(dòng)提升晦款,這樣,編程的時(shí)候不容易出錯(cuò)枚冗。
函數(shù)提升
函數(shù)提升是把整個(gè)函數(shù)都提到前面去缓溅。
function test(){
fun();
function fun(){
alert("fun");
}
}
test();
但是這樣卻不行
function test(){
fun();
var fun =function f(){
alert("fun");
}
}
test();
WHY?
因?yàn)榱尬拢琂S中函數(shù)的寫(xiě)法坛怪,一種是函數(shù)表達(dá)式,另外一種是函數(shù)聲明方式股囊。只有函數(shù)聲明形式才能被提升袜匿。
三者的區(qū)別
-
let:
作用域是塊級(jí),不能在同一塊級(jí)作用域中重復(fù)聲明稚疹,擁有暫時(shí)性死區(qū)居灯,沒(méi)有變量提升。
當(dāng)進(jìn)入let作用域内狗,立即創(chuàng)建存儲(chǔ)空間穆壕;獲取或設(shè)置未初始的變量會(huì)拋異常,Reference error其屏;當(dāng)執(zhí)行到變量聲明的時(shí)候喇勋,若定義了值就賦值,若沒(méi)有值偎行,那就是udefined川背,變量在暫時(shí)性死區(qū)不能被訪問(wèn)贰拿,所以無(wú)法對(duì)它使用typeof。 -
const:
作用域是塊級(jí)熄云,不能重復(fù)聲明,并且聲明的同時(shí)就要賦值膨更,擁有暫時(shí)性死區(qū),聲明常量缴允。
在暫時(shí)性死區(qū)內(nèi)它不能被訪問(wèn)(獲取或設(shè)置)直到執(zhí)行到達(dá)聲明荚守。 -
var:
作用域是函數(shù)作用域,可以重復(fù)聲明练般,沒(méi)有暫時(shí)性死區(qū)矗漾,有變量提升。
當(dāng)進(jìn)入var的作用域薄料,立即為它創(chuàng)建存儲(chǔ)空間敞贡,變量會(huì)立即被初始化并賦值為undefined,當(dāng)執(zhí)行到變量聲明的時(shí)候摄职,若變量定義了值則會(huì)被賦值誊役。