let和Const命令
let命令
let命令所聲明的變量只能在代碼塊中存在。
暫時(shí)性死區(qū)
使用let聲明變量時(shí),只要變量在還沒(méi)有聲明完成前使用真慢,就會(huì)報(bào)錯(cuò)。
暫時(shí)性死區(qū)的本質(zhì)就是理茎,只要一進(jìn)入當(dāng)前作用域黑界,所要使用的變量就已經(jīng)存在了,但是不可獲取皂林,只有等到聲明變量的那一行代碼出現(xiàn)朗鸠,才可以獲取和使用該變量。
不允許重復(fù)聲明
let不允許在相同作用域重復(fù)聲明同一個(gè)變量
塊級(jí)作用域
es6新增了塊級(jí)作用域础倍,let所帶來(lái)的結(jié)果
ES6的塊級(jí)作用域與函數(shù)聲明
es5 函數(shù)不可以在塊級(jí)作用域聲明函數(shù)
ES6 規(guī)定烛占,塊級(jí)作用域之中,函數(shù)聲明語(yǔ)句的行為類(lèi)似于let,在塊級(jí)作用域之外不可引用
ES6 改變了塊級(jí)作用域內(nèi)聲明的函數(shù)的處理規(guī)則忆家,顯然會(huì)對(duì)老代碼產(chǎn)生很大影響犹菇。為了減輕因此產(chǎn)生的不兼容問(wèn)題,ES6在附錄B里面規(guī)定芽卿,瀏覽器的實(shí)現(xiàn)可以不遵守上面的規(guī)定揭芍,有自己的行為方式。
! 塊級(jí)作用域內(nèi)部是可以訪問(wèn)全局變量的
允許在塊級(jí)作用域內(nèi)聲明函數(shù)卸例。
函數(shù)聲明類(lèi)似于var称杨,即會(huì)提升到全局作用域或函數(shù)作用域的頭部。
同時(shí)筷转,函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部姑原。
根據(jù)這三條規(guī)則,在瀏覽器的 ES6 環(huán)境中呜舒,塊級(jí)作用域內(nèi)聲明的函數(shù)锭汛,行為類(lèi)似于var聲明的變量
考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)袭蝗。如果確實(shí)需要店乐,也應(yīng)該寫(xiě)成函數(shù)表達(dá)式,而不是函數(shù)聲明語(yǔ)句呻袭。
`
// 函數(shù)聲明語(yǔ)句
{
let a = 'secret';
function f() {
return a;
}
}
// 函數(shù)表達(dá)式
{
let a = 'secret';
let f = function () {
return a;
};
}
`
do 表達(dá)式
讓塊級(jí)作用域變成表達(dá)式,可以返回值
let x = do{ let t = f(); t * t+1; }
const命令
只讀常量腺兴,一旦聲明左电,常量的值就不可以改變,所以聲明的時(shí)候必須給其賦值
- const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效页响。
- const命令聲明的常量也是不提升篓足,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用闰蚕。
- const聲明的常量栈拖,也與let一樣不可重復(fù)聲明。
- 對(duì)于復(fù)合類(lèi)型的變量没陡,變量名不指向數(shù)據(jù)涩哟,而是指向數(shù)據(jù)所在的地址。const命令只是保證變量名指向的地址不變盼玄,并不保證該地址的數(shù)據(jù)不變贴彼,所以將一個(gè)對(duì)象聲明為常量必須非常小心
const a = []; a.push('Hello'); // 可執(zhí)行 a.length = 0; // 可執(zhí)行 a = ['Dave']; // 報(bào)錯(cuò)
- 上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址埃儿,這個(gè)地址指向一個(gè)對(duì)象器仗。不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的精钮,所以依然可以為其添加新屬性威鹿。
- 對(duì)象凍結(jié)
頂層屬性對(duì)象
ES6為了改變這一點(diǎn),一方面規(guī)定轨香,為了保持兼容性忽你,var命令和function命令聲明的全局變量,依舊是頂層對(duì)象的屬性弹沽;另一方面規(guī)定檀夹,let命令、const命令策橘、class命令聲明的全局變量炸渡,不屬于頂層對(duì)象的屬性。也就是說(shuō)丽已,從ES6開(kāi)始蚌堵,全局變量將逐步與頂層對(duì)象的屬性脫鉤。
`
var a = 1;
// 如果在Node的REPL環(huán)境沛婴,可以寫(xiě)成global.a
// 或者采用通用方法吼畏,寫(xiě)成this.a
window.a // 1
let b = 1;
window.b // undefined
`
上面代碼中,全局變量a由var命令聲明嘁灯,所以它是頂層對(duì)象的屬性泻蚊;全局變量b由let命令聲明,所以它不是頂層對(duì)象的屬性丑婿,返回undefined性雄。
global對(duì)象
瀏覽器里面,頂層對(duì)象是window羹奉,但 Node 和 Web Worker 沒(méi)有window秒旋。
瀏覽器和 Web Worker 里面,self也指向頂層對(duì)象诀拭,但是Node沒(méi)有self迁筛。
Node 里面,頂層對(duì)象是global耕挨,但其他環(huán)境都不支持细卧。