let
- 不存在變量提升逸吵,有暫時性死區(qū),引用前需提前聲明
- 同一作用域內(nèi)不能重復(fù)聲明
- 其聲明的的全局變量不屬于頂層對象的屬性
const
- 不存在變量提升缝裁,有暫時性死區(qū)胁塞,引用前需提前聲明
- 只能在聲明時賦值
- 同一作用域內(nèi)不能重復(fù)聲明
- 不能重復(fù)賦值
- 賦值為基本類型,則不能修改;賦值為引用類型压语,則可修改(若希望將對象凍結(jié)啸罢,可以使用Object.freeze()方法)
- 其聲明的的全局變量不屬于頂層對象的屬性
tips
變量提升:
類比函數(shù)聲明提升:函數(shù)聲明來定義函數(shù)即可實現(xiàn)函數(shù)聲明提升,這樣胎食,我們可以先調(diào)用函數(shù)扰才,后聲明函數(shù);而函數(shù)表達(dá)式方法不會實現(xiàn)函數(shù)聲明提升厕怜,這樣衩匣,如果先調(diào)用函數(shù)蕾总,后聲明函數(shù),則會拋出錯誤琅捏。那么可以以此類推,var定義變量:可以先使用生百,后聲明;而let柄延、const定義變量:只可先聲明蚀浆,后使用
暫時性死區(qū):
ES6 明確規(guī)定,如果區(qū)塊中存在let和const命令搜吧,這個區(qū)塊對這些命令聲明的變量市俊,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量滤奈,就會報錯摆昧。
總之,在代碼塊內(nèi)蜒程,使用let命令聲明變量之前绅你,該變量都是不可用的。這在語法上昭躺,稱為“暫時性死區(qū)”(temporal dead zone勇吊,簡稱 TDZ)
塊級作用域:
ES5 只有全局作用域和函數(shù)作用域,沒有塊級作用域窍仰,這帶來很多不合理的場景。第一種場景礼殊,內(nèi)層變量可能會覆蓋外層變量驹吮。第二種場景,用來計數(shù)的循環(huán)變量泄露為全局變量晶伦。
ES6的塊級作用域碟狞,允許塊級作用域的任意嵌套,內(nèi)層作用域可以定義外層作用域的同名變量婚陪。塊級作用域的出現(xiàn)族沃,實際上使得獲得廣泛應(yīng)用的立即執(zhí)行函數(shù)表達(dá)式(IIFE)不再必要了。
頂層對象:
頂層對象泌参,在瀏覽器環(huán)境指的是window對象脆淹,在 Node 指的是global對象。ES5 之中沽一,頂層對象的屬性與全局變量是等價的盖溺。ES6 之中,為了保持兼容性铣缠,var和function聲明的全局變量烘嘱,依舊是頂層對象的屬性昆禽;let、const蝇庭、class聲明的全局變量醉鳖,不屬于頂層對象的屬性。