亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果 let 沒有被提升或者它們進入了臨時死區,那么為什么這個片段會拋出錯誤

如果 let 沒有被提升或者它們進入了臨時死區,那么為什么這個片段會拋出錯誤

千萬里不及你 2023-10-18 16:35:54
var a = 6;{  console.log(a)  let a =55  } 當我執行此代碼片段時,我收到以下錯誤消息:ReferenceError:初始化前無法訪問“a”為什么 console.log(a) 沒有給出 6 結果。
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

您的問題的答案就在您的標題中:該變量位于“暫時死區”,這只是您所看到的行為的名稱。

與使用 聲明的變量不同var,變量將以未定義的值開始,let變量在其定義被求值之前不會被初始化。在初始化之前訪問變量會產生ReferenceError.?從塊開始直到處理初始化為止,該變量處于“臨時死區”。

塊的開始是開頭{,您的console.log(a)來之前let聲明,因此它位于這個“死區”。

為什么會這樣呢?因為它可以幫助程序員檢測代碼中由于不同作用域中同名變量之間的混淆而導致的錯誤。


查看完整回答
反對 回復 2023-10-18
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

嵌套塊將創建一個新的塊作用域的詞法環境。


內部a變量在該范圍內聲明,但在初始化之前訪問,因此出現錯誤。


內部作用域let a聲明覆蓋了var a聲明,因此它是一個不同的變量,就好像您這樣寫:


var a = 6;

{

  console.log(a2)

  let a2 =55

  


查看完整回答
反對 回復 2023-10-18
?
人到中年有點甜

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已經聲明但還沒有賦值。


查看完整回答
反對 回復 2023-10-18
  • 3 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號