let和const

在ES5中,var命令會發(fā)生”變量提升“現(xiàn)象,即變量可以在聲明之前使用,值為undefined。這種現(xiàn)象多多少少是有些奇怪的,按照一般的邏輯,變量應(yīng)該在聲明語句之后才可以使用。

為了糾正這種現(xiàn)象,ES6中,let命令改變了語法行為,它所聲明的變量一定要在聲明后使用,否則報錯。

在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區(qū)”(temporal dead zone,簡稱 TDZ)。

當(dāng)然,在ES6中也不是沒有變量提升,當(dāng)你在最外層定義let時,之后也是可以變量提升的

即使在寫變量名時,ES5和ES6都是不允許重復(fù)聲明的,否則會報錯

image.png

也不能函數(shù)內(nèi)部重新聲明參數(shù)

image.png

為什么要有塊級作用域

ES5 只有全局作用域和函數(shù)作用域,沒有塊級作用域,這帶來很多不合理的場景。

第一種場景,內(nèi)層變量可能會覆蓋外層變量。
第二種場景,用來計數(shù)的循環(huán)變量泄露為全局變量。

ES6中的作用域不會相互影響,即使在全局和局部的變量名聲明的一樣,當(dāng)打印全局的值時,也不會影響局部的值

而且ES6 允許塊級作用域的任意嵌套。外層的變量名可以和內(nèi)層的變量名一樣,但是外層的訪問不到內(nèi)層的變量

塊級作用域與函數(shù)聲明
函數(shù)能不能在塊級作用域之中聲明?這是一個相當(dāng)令人混淆的問題。

ES5 規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明,不能在塊級作用域聲明。
ES6 引入了塊級作用域,明確允許在塊級作用域之中聲明函數(shù)。ES6 規(guī)定,塊級作用域之中,函數(shù)聲明語句的行為類似于let,在塊級作用域之外不可引用。

允許在塊級作用域內(nèi)聲明函數(shù)。
函數(shù)聲明類似于var,即會提升到全局作用域或函數(shù)作用域的頭部。
同時,函數(shù)聲明還會提升到所在的塊級作用域的頭部。
注意,上面三條規(guī)則只對 ES6 的瀏覽器實現(xiàn)有效,其他環(huán)境的實現(xiàn)不用遵守,還是將塊級作用域的函數(shù)聲明當(dāng)作let處理。

根據(jù)這三條規(guī)則,在瀏覽器的 ES6 環(huán)境中,塊級作用域內(nèi)聲明的函數(shù),行為類似于var聲明的變量。

另外,還有一個需要注意的地方。ES6 的塊級作用域允許聲明函數(shù)的規(guī)則,只在使用大括號的情況下成立,如果沒有使用大括號,就會報錯。

本質(zhì)上,塊級作用域是一個語句,將多個操作封裝在一起,沒有返回值。
現(xiàn)在有種辦法可以將塊級作用域變成表達(dá)式,也就是說可以有返回值,只要在塊級作用域之前加do,讓他變成do表達(dá)式

const
const是一個只讀的常量,一旦定義,就不能更改,否則會報錯。
也就意味著,一旦聲明就必須立即初始化,不能留到之后再賦值。
當(dāng)然了,不聲明變量,也會報錯。
并且,const的作用域和let的命令相同:必須在聲明的作用域之內(nèi)才會有效。
const也同let一樣,不會變量提升,存在暫時性死區(qū),也不可重復(fù)聲明。

const不是說它定義的那個值不得改動,而是它指向內(nèi)存的地址不得改動

對于簡單的數(shù)據(jù)類型(數(shù)值,字符串,布爾值)的時候,他們的值就存放在變量指向的內(nèi)存地址中。也因此等同于常量

然而,對于復(fù)合數(shù)據(jù)類型(對象,數(shù)組),變量指向內(nèi)存時就一個指針,而const只能保證這個指針是固定的,對于其中指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的就完全不能控制了,你也可以在數(shù)據(jù)中添加或者刪除數(shù)據(jù)

如果說,你要講數(shù)據(jù)什么的都固定好,不讓別人在里面進(jìn)行添加鍵值對,也

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容