摘要:對比常量聲明與聲明常量聲明與聲明,都是塊級聲明。最后一點全局塊級綁定與不同于的另一個方面是在全局作用域上的表現(xiàn)。塊級綁定新的最佳實踐在的發(fā)展階段,被廣泛認(rèn)可的變量聲明方式是默認(rèn)情況下應(yīng)當(dāng)使用而不是??偨Y(jié)與塊級綁定將詞法作用域引入。
var變量與變量提升
使用var關(guān)鍵字聲明的變量,無論其實際聲明位置在何處,都會被視為聲明于所在函數(shù)的頂部(如果聲明不在任意函數(shù)內(nèi),則被視為在全局作用域的頂部)。這就是所謂的變量提升(hoisting)
后臺實際上會轉(zhuǎn)化成這樣
value變量的聲明被提升到了頂部,而初始化工作則保留在原處。這以為著在else分支value的變量也是可訪問的,此處它的值會是undefined,因為它并沒有被初始化。
塊級聲明塊級聲明也就是讓所聲明的變量在指定快的作用域外無法被訪問。塊級作用域在如下情況被創(chuàng)建;
1 在一個函數(shù)內(nèi)部
2 在一個代碼塊(由一對花括號包裹)內(nèi)部
let聲明語法域var語法一致
let聲明沒有被提升到函數(shù)定義的頂部,這樣使用會報
上面就是塊級作用域的基本使用。下面會帶來一點let和var特別的地方
禁止重復(fù)聲明如果一個標(biāo)識符已經(jīng)在代碼塊內(nèi)部被定義,那么在此代碼塊內(nèi)使用同一個標(biāo)識符進行l(wèi)et聲明就會導(dǎo)致拋出錯誤
上面會報錯,但是var聲明是不會的
不在同一級別聲明變量,不會報錯,這個新變量會屏蔽全局的
count變量,從而在局部阻止對于后者的訪問。
const常量,它們的值在被設(shè)置完成后就不能再被改變,所有的const變量都需要在聲明試進行初始化。
對比常量聲明與let聲明
1 常量聲明與let聲明,都是塊級聲明。這意味著常量在聲明它們的語句塊外部是無法訪問的,并且聲明也不會被提升
2 const變量和let另一個相似的地方,也是禁止重復(fù)聲明
使用const聲明對象
const聲明會阻止對于變量綁定與變量本身自身值的修改,這意味著const聲明并不會阻止對變量成員的修改
記住:const阻止的是變量綁定的修改,而不是阻止對成員值的修改。
暫時性死區(qū)使用let或const聲明的變量,在達(dá)到聲明處之前都是無法訪問的,試圖訪問會導(dǎo)致一個引用錯誤,即使在通常是安全的操作時(例如使用typeof運算符),也是如此
塊級作用域最需要使用的場景1-循環(huán)中的塊級綁定
對比var let明顯使用let符合我們的使用期望。
上述原因因為變量i在循環(huán)的每次迭代被共享了(沒有塊級作用域)
為了修正這個問題,開發(fā)者在循環(huán)內(nèi)使用立即調(diào)用函數(shù)表達(dá)式,以便在每次迭代中強制創(chuàng)建變量的一個新副本
幸運的是使用let完美解決這個問題
let每次使用完,就銷毀重新創(chuàng)建。
在常規(guī)的for循環(huán)中,你可以初始化時使用const。但循環(huán)會在試圖改變該變量的值時拋出錯誤。
BUT!!!!!!!!!!!!!
const變量在for-in或for-of循環(huán)中使用時,與let變量效果相同。
let與const不同于var的另一個方面是在全局作用域上的表現(xiàn)。當(dāng)在全局作用域上使用var時,它會創(chuàng)建一個新的全局變量,并成為全局對象(在瀏覽器中是window)的一個屬性,這意味著使用var可能會無意覆蓋一個已有的全局屬性
然而若你在全局作用域上使用let或者const。雖然在全局作用域上會創(chuàng)建新的綁定,但不會有任何屬性被添加到全局對象上。這也就意味著你不能使用let或const來覆蓋一個全局變量,你只能將其屏蔽。
塊級綁定新的最佳實踐在es6的發(fā)展階段,被廣泛認(rèn)可的變量聲明方式是:默認(rèn)情況下應(yīng)當(dāng)使用let而不是var。對于多數(shù)js開發(fā)者來說,let的行為方式正式var本應(yīng)有的方式,因此直接用let代替var更符合邏輯。
然而隨著更多的開發(fā)者遷移到es6上,一種代替方案變得更為流行。那就是默認(rèn)情況下使用const,并且只在知道變量值需要被更改的情況下才使用let。其理論依據(jù)是大部分變量在初始化之后都不應(yīng)當(dāng)被修改,以為預(yù)期外的改動是bug的源頭之一。
總結(jié)let 與 const 塊級綁定將詞法作用域引入js。這兩種聲明方式都不會進行提升。并且只會在聲明它們的代碼塊內(nèi)部存在。由于變量能夠再必要位置被準(zhǔn)確聲明,其表現(xiàn)更加接近其他語言,并且能減少無心錯誤的產(chǎn)生,作為一個副作用,你不能在變量聲明位置之前訪問它們,即便使用的是typeof 這樣的安全運算符,由于塊級綁定存在暫時性死區(qū),試圖在聲明位置之前訪問它就會導(dǎo)致錯誤。
let與const的表現(xiàn)在很多情況下都相似與var ,然后在循環(huán)中就不是這樣,在for-in與for-of循環(huán)中。let與const都能每一次迭代時創(chuàng)建一個新的綁定,這意味著在循環(huán)體內(nèi)創(chuàng)建的函數(shù)可以使用當(dāng)前迭代所綁定的循環(huán)變量值(而不是像使用var那樣,統(tǒng)一使用循環(huán)結(jié)束時的變量值)。這一點在for循環(huán)中使用let聲明時也成立,不過在for循環(huán)中使用const聲明則會導(dǎo)致錯誤。
塊級綁定當(dāng)前的最佳實踐就是:在默認(rèn)情況下使用const.而只在你知道變量值需要被更改的情況下才使用let。這在代碼中能夠確?;緦哟蔚牟豢勺冃?,有助于防止某些類型的錯誤。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89039.html
摘要:聲明聲明的語法與的語法一致??偨Y(jié)文章都是以深入理解讀書筆記形式,大部分引用書中的定義,加上作者的理解,樣例也做了調(diào)整,所有樣例都可以放到里運行親自嘗試。 1.變量提升 使用 var 關(guān)鍵字聲明的變量,無論其實際聲明位置在何處,都會被視為聲明于所在函數(shù)的 頂部(如果聲明不在任意函數(shù)內(nèi),則視為在全局作用域的頂部)。這句話從字面上不難理解。 但是他是怎樣一個過程,為什么會這樣。當(dāng)你代...
摘要:和都能夠聲明塊級作用域,用法和是類似的,的特點是不會變量提升,而是被鎖在當(dāng)前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時死區(qū)臨時死區(qū)的意思是在當(dāng)前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。 主要知識點有:var變量提升、let聲明、const聲明、let和const的比較、塊級綁定的應(yīng)用場景showImg(https://segmentfault.com/img...
摘要:特性介紹箭頭函數(shù)是新增的特性之一,它為這門語言提供了一種全新的書寫函數(shù)的語法。用生成的函數(shù)會定義一個自己的,而箭頭函數(shù)沒有自己的,而是會和上一層的作用域共享。 本文同步自我得博客:http://www.joeray61.com JS中的箭頭 箭頭在JS里并不算是個新鮮的玩意兒,一直以來,JS都支持-->這樣的箭頭。 很早的時候有些瀏覽器還不支持JS,當(dāng)時的人們?yōu)榱思嫒葸@些瀏覽器,需要這...
摘要:聲明的變量只在其所在的代碼塊內(nèi)有效。只要在聲明之前使用這些變量,就會報錯。在語法上稱為暫時性死區(qū)有時候,會不經(jīng)間遇到比較隱蔽的死區(qū),不太容易被發(fā)現(xiàn)。不允許重復(fù)聲明不允許在相同的作用域內(nèi)聲明同一個變量。一旦聲明,其值就不能再改變。 let && const let let聲明的變量只在其所在的代碼塊內(nèi)有效。 { let a = 10; } console.log(a) //R...
摘要:沒有聲明的情況和都能夠聲明塊級作用域,用法和是類似的,的特點是不會變量提升,而是被鎖在當(dāng)前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時死區(qū)的意思是在當(dāng)前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。 本章涉及3個知識點,var、let、const,現(xiàn)在讓我們了解3個關(guān)鍵字的特性和使用方法。 var JavaScript中,我們通常說的作用域是函數(shù)作用域,使用var聲...
閱讀 935·2023-04-25 23:40
閱讀 3714·2021-11-22 15:22
閱讀 3556·2021-10-09 09:44
閱讀 3408·2021-09-23 11:52
閱讀 1266·2021-09-22 15:43
閱讀 793·2021-09-10 10:51
閱讀 2213·2021-09-06 15:02
閱讀 3207·2021-09-06 15:02