3 回答

TA貢獻1851條經驗 獲得超3個贊
您的問題的答案就在您的標題中:該變量位于“暫時死區”,這只是您所看到的行為的名稱。
與使用 聲明的變量不同
var
,變量將以未定義的值開始,let
變量在其定義被求值之前不會被初始化。在初始化之前訪問變量會產生ReferenceError
.?從塊開始直到處理初始化為止,該變量處于“臨時死區”。
塊的開始是開頭{
,您的console.log(a)
來之前let
聲明,因此它位于這個“死區”。
為什么會這樣呢?因為它可以幫助程序員檢測代碼中由于不同作用域中同名變量之間的混淆而導致的錯誤。

TA貢獻1801條經驗 獲得超8個贊
嵌套塊將創建一個新的塊作用域的詞法環境。
內部a變量在該范圍內聲明,但在初始化之前訪問,因此出現錯誤。
內部作用域let a聲明覆蓋了var a聲明,因此它是一個不同的變量,就好像您這樣寫:
var a = 6;
{
console.log(a2)
let a2 =55
}

TA貢獻1895條經驗 獲得超7個贊
為了補充上述兩個答案,該語句let a = 55實際上是兩個語句合而為一:let a- 聲明 - 和a = 55- 賦值。由于 Javascript 的提升規則,聲明在塊的入口處進行處理,但賦值保留其詞法位置。
所以塊:
var a = 6
{
console.log(a)
let a = 55
}
在語義上等同于:
var a = 6
{
let a
console.log(a)
a = 55
}
因為局部聲明a屏蔽了同名的全局變量,所以console.log(a)執行時a已經聲明但還沒有賦值。
添加回答
舉報