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

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

有大佬遇到過這個問題嗎:es6關于暫時性死區的疑問

有大佬遇到過這個問題嗎:es6關于暫時性死區的疑問

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

2 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

JavaScript引擎在掃描代碼發現變量聲明時,要么將它們提升至作用域頂部(遇到var聲明),要么將聲明放到TDZ中(遇到let和const聲明),訪問TDZ中的變量會觸發運行時錯誤。只要執行過變量聲明語句后,變量才會從TDZ中移除,然后方可正常訪問。
vartmp=123;
if(true){
tmp='abc';//ReferenceError:tmpisnotdefined
lettmp;
}
當訪問if里的tmp時,訪問的是TDZ中的tmp,而不是全局的tmp。
                            
查看完整回答
反對 回復 2019-08-21
?
MM們

TA貢獻1886條經驗 獲得超2個贊

你這個在思考問題的時候顯然沒有用到任何TDZ的概念??!你在看TDZ,但是還是按照你自己原先的理解去思考問題,那還怎么學習?干脆自己出本書吧,就叫《我理解的javascript》
                            
查看完整回答
反對 回復 2019-08-21
  • 2 回答
  • 0 關注
  • 331 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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