官术网_书友最值得收藏!

1.1 let及const

Let及const命令是ES6新增的兩種新的聲明格式,用于補(bǔ)全ES5標(biāo)準(zhǔn)中var聲明變量的不足,下面具體介紹這兩種命令。

1.1.1 let命令

在JS中是通過(guò)關(guān)鍵字“var”來(lái)聲明變量的,但是在JS中用“var”來(lái)聲明變量會(huì)出現(xiàn)變量提升的情況,代碼如下:

這段代碼中,如果沒(méi)有聲明var a=10的話,打印變量a會(huì)出現(xiàn)“a is not defined”的錯(cuò)誤,但是用“var”聲明變量“a”后,“a”的打印結(jié)果是undefined,出現(xiàn)這種結(jié)果的原因是因?yàn)椤皏ar”聲明變量時(shí)的提升機(jī)制(Hoisting)導(dǎo)致的。實(shí)際上,在執(zhí)行過(guò)程中JS會(huì)把上面代碼解析成如下格式:

也就是說(shuō)通過(guò)“var”聲明的變量系統(tǒng)都會(huì)把聲明隱式地升至頂部,這樣的特性往往會(huì)讓剛接觸JavaScript及習(xí)慣其他語(yǔ)言的開發(fā)人員不適應(yīng),導(dǎo)致程序出現(xiàn)問(wèn)題。所以針對(duì)以上情況,ES6引入了let命令來(lái)聲明變量。let聲明和var聲明用法一致,但是不會(huì)出現(xiàn)變量突然提升的情況,具體代碼如下:

利用let聲明還可以把變量的作用域限制在代碼塊中,ES5中定義作用域有兩種,全局作用域和函數(shù)作用域。ES5中沒(méi)有塊級(jí)作用域的概念,因此ES6中新增了塊級(jí)作用域,用{}表示。塊級(jí)作用域用于聲明作用域之外無(wú)法訪問(wèn)的變量。主要有兩種:

1)函數(shù)內(nèi)部塊級(jí)作用域:

2)在字符{}之間的區(qū)域:

let在使用過(guò)程中除了上述情況外,還需要注意let聲明過(guò)程中是禁止重復(fù)聲明的:

1.1.2 const命令

ES6中還提供了const關(guān)鍵字。使用const聲明的是常量,常量的值不能通過(guò)重新賦值來(lái)改變,并且不能重新聲明,所以每次通過(guò)const來(lái)聲明的常量必須進(jìn)行初始化。

與其他語(yǔ)言不同,const在使用過(guò)程中如果聲明的是對(duì)象,需要注意修改對(duì)象的屬性值,但是不允許修改已經(jīng)聲明的對(duì)象。例如:

如果想讓對(duì)象屬性不能修改,可以借助Object.freeze函數(shù)來(lái)凍結(jié)對(duì)象,實(shí)現(xiàn)代碼如下:

但是通過(guò)Object.freeze凍結(jié)對(duì)象需要注意不能凍結(jié)多層對(duì)象:

要解決多層對(duì)象的凍結(jié)問(wèn)題可以通過(guò)封裝一個(gè)deepFreeze函數(shù)來(lái)實(shí)現(xiàn):

1.1.3 臨時(shí)死區(qū)

let與const都是塊級(jí)標(biāo)識(shí)符,所以let與const都是在當(dāng)前代碼塊內(nèi)有效,常量不存在變量提升的情況。但是通過(guò)let及const聲明的常量,會(huì)放在臨時(shí)死區(qū)(temporal dead zone),通過(guò)下面代碼可以看出:

即使通過(guò)安全的typeof操作符也會(huì)報(bào)錯(cuò),原因是JavaScript引擎在掃描代碼變量時(shí),要么會(huì)把變量提升至頂部,要么會(huì)把變量放在臨時(shí)死區(qū)。這里通過(guò)let來(lái)聲明“a”變量,會(huì)把“a”變量放在臨時(shí)死區(qū),所以在聲明之前打印就會(huì)報(bào)錯(cuò)。

1.1.4 循環(huán)中的let及const

在ES5標(biāo)準(zhǔn)中,for循環(huán)都是通過(guò)var來(lái)聲明的,由于var沒(méi)有獨(dú)立的作用域,導(dǎo)致在循環(huán)中創(chuàng)建函數(shù)時(shí)會(huì)出現(xiàn)結(jié)果和思路不一致的情況。代碼如下:

循環(huán)執(zhí)行結(jié)果并不是預(yù)想的0,1,2,3,4而是5個(gè)5,這是因?yàn)関ar聲明在循環(huán)中作用域共用,并且會(huì)把i保存在全局作用域中。要解決循環(huán)中保存函數(shù)的問(wèn)題,可以利用閉包創(chuàng)建獨(dú)立作用域。將代碼改寫如下:

這樣通過(guò)自執(zhí)行函數(shù)就可以解決循環(huán)中創(chuàng)建函數(shù)的問(wèn)題。但是利用ES6中l(wèi)et及const提供的塊級(jí)作用域可以讓上面寫法變得更加簡(jiǎn)單。代碼如下:

這樣得到的結(jié)果就是預(yù)想的結(jié)果。由于const不能被重新賦值,所以在for循環(huán)中如果利用const來(lái)定義變量會(huì)報(bào)錯(cuò)。代碼如下:

在for-in或for-of循環(huán)中使用const時(shí),方法與let一致,代碼如下:

主站蜘蛛池模板: 三台县| 古浪县| 都安| 嘉义县| 定结县| 铜陵市| 仲巴县| 虹口区| 绥江县| 北安市| 五华县| 静乐县| 唐河县| 芒康县| 于田县| 大港区| 洛宁县| 北流市| 富裕县| 广饶县| 临颍县| 广元市| 沅江市| 鲁甸县| 兴仁县| 同仁县| 威宁| 清苑县| 抚松县| 外汇| 洪洞县| 江源县| 麻栗坡县| 洛宁县| 公主岭市| 杂多县| 开阳县| 名山县| 江西省| 海兴县| 喀什市|