剛纔在看阮一峰老師的《ES6標準入門》,在介紹 let 那一段時有這麼一段話 我就自己在控制台試了一下這段代碼,輸出果然的是"abc",於是我就把代碼稍微修改了下 也沒啥問題,證明瞭上面那段話的正確性。 然後,我又把 i++ 前的 console.log(i) 挪到了下麵,神奇的事情發生了! 剛纔還 ...
剛纔在看阮一峰老師的《ES6標準入門》,在介紹 let 那一段時有這麼一段話
我就自己在控制台試了一下這段代碼,輸出果然的是"abc",於是我就把代碼稍微修改了下
也沒啥問題,證明瞭上面那段話的正確性。
然後,我又把 i++ 前的 console.log(i) 挪到了下麵,神奇的事情發生了!
剛纔還好好的,怎麼突然就這樣了呢?再修改下代碼試試
結果又出來了!
思考:
JavaScript 代碼在編譯階段會進行詞法分析,應該就是在這個時候 JavaScript 引擎內部發現了定義在迴圈變數那裡的 let 塊級作用域和定義在迴圈體內部的 let 塊級作用域。既然 let 是不能夠跨域訪問的,那麼根據就近原則,寫在迴圈體內部的 console.log(i) 就是屬於內部的這個 let 塊級作用域的,在引用 i 的時候自然就會從內部的這個 let 塊級作用域中去找,但是 let i = 'abc' 又是定義在引用輸出 i 之後,結果自然就報錯了。
補充:
尷尬了尷尬了。。。
剛看完一小部分就跑來寫了文章,結果緊接著就是講這個問題,這種現象有個專業名詞叫“TDZ” ( ̄_ ̄|||)
參考文章:《ES6標準入門》阮一峰:let 和 const 命令