let塊級作用域咋理解
不會變數提升
因此用let代替var宣告變數就可以把變數的作用域限制在當前的程式碼塊中
除了在value定義的程式碼塊,也就是condition為true的情況下,value是有值的
執行流離開if塊,value立即被銷燬,使用value值都會丟擲一個引用錯誤
2、禁止重宣告
無論另一個變數是用var還是let宣告的
同一作用域中不能用let重複宣告已經存在的識別符號,否則會丟擲一個語法錯誤
const宣告
用來宣告一個常量。它有以下特點:
1、不會變數提升
2、禁止重宣告
3、值一旦被設定後不可更改
否則丟擲語法錯誤
tips:常量如果是物件,那麼物件中的值可以修改
原因:const宣告不允許修改繫結,但允許修改值
4、必須初始化
否則丟擲語法錯誤,這是由特點3決定的
四、暫時性死區(Temporal Dead Zone,TDZ)
在let或const宣告之前訪問這些變數,會丟擲引用錯誤
原理:
JS引擎在掃描程式碼發現變數宣告時,要麼將他們提升至作用域頂部(遇到var宣告),要麼將宣告放到TDZ中(遇到let和const宣告)。訪問TDZ中的變數會觸發執行時錯誤。只有執行過變數宣告語句後,變數才會從TDZ中移出,然後才可正常訪問。
五、迴圈中的let宣告
同學們應該常常這樣寫for迴圈:
由於Hoisting,i的宣告提升到函式頂部,導致在循壞外部依舊可以訪問到i,輸出是10
在沒有ES6之前,由於這個特性,我們很難在迴圈中建立函式,看以下例子:
函式租後會輸出10次10,因為,i由於之前for迴圈裡的自增,已經變成了10。在forEach迴圈的時候,每次迭代都同時共享變數i。
這明顯與函式的本意不符!
為了解決這個問題,開發者們使用了立即執行函式(IIFE):
立即執行函式,顧名思義就是在函式定
原理是:let宣告每次迭代都會建立一個新變數,並以之前迭代中的同名變數的值將其初始化