正在學習ES6的內容,看的是阮一峰老師出的書,看到變量聲明那里,關于暫時性死區的內容。這里有一個例子:var tmp = 123;if (true) {
tmp = 'abc'; // ReferenceError:tmp is not defined
let tmp;
}看完對這個例子的解析,還是沒有解決我的疑問。我不把let的聲明放到代碼塊前面。我是這么看這個例子的:首先,因為代碼中沒有函數,所以聲明了一個全局的變量tmp并且初始化一個值123。然后進入條件語句之后,再給這個全局變量重新賦值,接著后面聲明了一個只在花括號內有效的和全局變量同名的一個變量。最后報錯。tmp沒有定義,可是明明已經全局聲明過tmp了,所以這么報錯是因為和局部的塊作用域的tmp沖突了。然后改下代碼,換了let變量名:var tmp = 123;if (true) {
tmp = 'abc';
let temp;
}// 輸出 abc 這來自全局tmp沒有報錯,并且輸出abc,塊作用域的temp不受影響結論是,代碼塊內不能聲明和全局變量同名的變量?這顯然不應該是這樣的,有點理不清了。
1 回答

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
JavaScript引擎在掃描代碼發現變量聲明時,要么將它們提升至作用域頂部(遇到var聲明),要么將聲明放到TDZ中(遇到let和const聲明),訪問TDZ中的變量會觸發運行時錯誤。只要執行過變量聲明語句后,變量才會從TDZ中移除,然后方可正常訪問。
var tmp = 123;if (true) { tmp = 'abc'; // ReferenceError:tmp is not defined let tmp; }
當訪問if里的tmp時,訪問的是TDZ中的tmp,而不是全局的tmp。
- 1 回答
- 0 關注
- 526 瀏覽
添加回答
舉報
0/150
提交
取消