ES6學習筆記 塊級繫結

2021-09-14 08:48:45 字數 2891 閱讀 4394

使用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運算子),也是如此

對比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。這在**中能夠確保基本層次的不可變性,有助於防止某些型別的錯誤。

ES6小結1 塊級繫結

變數提公升 hoisting 使用 var 關鍵字宣告的變數,無論其實際宣告位置在何處,都會被視為宣告於所在函式的頂部 如果宣告不在任意函式內,則視為在全域性作用域的頂部 特點 1 同名變數忽略 var foo var foo 忽略 var foo 忽略 忽略 2 同名函式覆蓋 function f...

es6學習 塊級作用域let const

先安裝node 新建1.js檔案,通過node的 cmd進入本地檔案1.js 執行 node 1.js 可以測試以下 1.基本用法 let 宣告變數,只在塊級作用域有效。console.log a a is not defined console.log b 2 在for 迴圈中使用,迴圈和迴圈內部...

es6 塊級作用域用法

iife 寫法 function 塊級作用域寫法 塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函式表示式 iife 不再必要了。function f function f 上面 在 es5 jscript不支援塊級作用域環境中執行,會得到 i am inside 因為在 if內宣告的函式f會被...