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