暫時(shí)性死區(qū):只要塊級(jí)作用域內(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ù)聲明。
對(duì)于復(fù)合類型的變量,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const命令只
是保證變量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變,所以將一個(gè)對(duì)象聲明為常量,
必須非常小心。
const foo = {};
? ? ? ? ? ? foo.prop = 123;
? ? ? ? ? ? console.log(foo.prop);
? ? ? ? ? ? //上面的常量foo存儲(chǔ)的是對(duì)象的地址,這個(gè)地址不可變,但依然可以添加屬性。const a = [];
? ? ? ? ? ? a.push("hello");
? ? ? ? ? ? a.length = 0;//? ? ? ? ? a = ["Dave"]? //報(bào)錯(cuò),賦值就是更換地址,不行的。//如果真的想把對(duì)象凍結(jié),應(yīng)該使用Object.freeze方法。const foo2 = Object.freeze({});
? ? ? ? ? ? //常規(guī)模式下,下面一行不起作用//嚴(yán)格模式下,會(huì)報(bào)錯(cuò)foo.prop = 123;
ES5只有兩種聲明變量的方法:var和function?! ?/p>
ES6有6種:var function let const class import
全局對(duì)象屬性:
?全局對(duì)象是最頂層的對(duì)象,在瀏覽器環(huán)境下指的是window對(duì)象,在node指的是
? global對(duì)象。ES5中,全局對(duì)象的屬性和全局變量是等價(jià)的。
?未聲明的全局變量,自動(dòng)成為全局對(duì)象window的屬性,這被認(rèn)為是js的最大敗筆。
? ES6為了改變這一點(diǎn),一方面規(guī)定,為了保持兼容性,var命令和function命令聲明的全局變量,
?依舊是全局對(duì)象的屬性,另一方面規(guī)定,let,const,class命令聲明的全局變量不屬于全局對(duì)象的
? 屬性。也就是說,從ES6開始,全局變量將逐漸與全局對(duì)象的屬性脫鉤。
ES5只有全局作用域和函數(shù)作用域,沒有塊級(jí)作用域,有很多不合理場(chǎng)景: