暫時(shí)性死區(qū):只要塊級作用域內(nèi)存在let命令扁耐,它所聲明的變量就綁定這個(gè)區(qū)域,不再受外部影響产阱。
暫時(shí)性死區(qū):let.const
let,不允許重復(fù)聲明婉称,let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量构蹬;不能在函數(shù)內(nèi)部重新聲明參數(shù)王暗;
const命令
?聲明一個(gè)只讀的常量。一旦聲明庄敛,常量的值就不能改變俗壹。
? 同時(shí)也說明,一旦聲明藻烤,就要立即初始化绷雏,否則也報(bào)錯(cuò)。
與let相似:
const命令聲明的常量也不提升隐绵,同樣存在暫時(shí)性死區(qū)之众,只能在聲明的位置后使用。
也不可以重復(fù)聲明依许。
對于復(fù)合類型的變量,變量名不指向數(shù)據(jù)缀蹄,而是指向數(shù)據(jù)所在的地址峭跳。const命令只
是保證變量名指向的地址不變膘婶,并不保證該地址的數(shù)據(jù)不變,所以將一個(gè)對象聲明為常量蛀醉,
必須非常小心悬襟。
const foo = {};
? ? ? ? ? ? foo.prop = 123;
? ? ? ? ? ? console.log(foo.prop);
? ? ? ? ? ? //上面的常量foo存儲的是對象的地址,這個(gè)地址不可變拯刁,但依然可以添加屬性脊岳。const a = [];
? ? ? ? ? ? a.push("hello");
? ? ? ? ? ? a.length = 0;//? ? ? ? ? a = ["Dave"]? //報(bào)錯(cuò),賦值就是更換地址垛玻,不行的割捅。//如果真的想把對象凍結(jié),應(yīng)該使用Object.freeze方法帚桩。const foo2 = Object.freeze({});
? ? ? ? ? ? //常規(guī)模式下亿驾,下面一行不起作用//嚴(yán)格模式下,會報(bào)錯(cuò)foo.prop = 123;
ES5只有兩種聲明變量的方法:var和function账嚎∧玻
ES6有6種:var function let const class import
全局對象屬性:
?全局對象是最頂層的對象,在瀏覽器環(huán)境下指的是window對象郭蕉,在node指的是
? global對象疼邀。ES5中,全局對象的屬性和全局變量是等價(jià)的召锈。
?未聲明的全局變量旁振,自動成為全局對象window的屬性,這被認(rèn)為是js的最大敗筆烟勋。
? ES6為了改變這一點(diǎn)规求,一方面規(guī)定,為了保持兼容性卵惦,var命令和function命令聲明的全局變量阻肿,
?依舊是全局對象的屬性,另一方面規(guī)定沮尿,let丛塌,const,class命令聲明的全局變量不屬于全局對象的
? 屬性畜疾。也就是說赴邻,從ES6開始,全局變量將逐漸與全局對象的屬性脫鉤啡捶。
ES5只有全局作用域和函數(shù)作用域姥敛,沒有塊級作用域,有很多不合理場景: