靚麗時尚館

位置:首頁 > 健康生活 > 心理

let塊級作用域咋理解

心理1.49W
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宣告每次迭代都會建立一個新變數,並以之前迭代中的同名變數的值將其初始化

標籤:塊級 作用域