質問: undefined となるようにすることに何か意味があったのでしょうか。 分かる方、分かりやすくお願いします。 ---------------解決方法---------------- https://qiita.com/ConquestArrow/items/8cb01744af15afff33c0 名前の競合を避けるためにlet宣言がブロックスコープで扱われる。
回答: 良い疑問点だなと思いました。 仕組み的なものは、書かれていたこちらの記事にほとんどのことは載っていますが、 https://qiita.com/ConquestArrow/items/8cb01744af15afff33c0 疑問に対して、簡単にお答えしたいと思います。 > > letに関しては、window.i = undefined となるようにすることに何か意味があったのでしょうか。 > > 分かる方、分かりやすくお願いします。 > > > `var`では、function外で宣言した場合にグローバルオブジェクト(ブラウザならwindow)のメンバーとして登録されることになります。 これは、質問者様が調べられたとおり、 ``` var i = 5; console.log(window.i === i); //true; ``` ということになるので、 ``` var i = 5; // と書くことは window.i = 5; // と書くのと同じ ``` ...という意味になります。 しかしながら、変数宣言をしただけのつもりで書いていたとしても、 実際にはグローバルオブジェクトの一部になってしまうというのは、大きな問題があります。 例えば、 `console.log` でお馴染みの `console` は、実際にはグローバルオブジェクトである `window.console`を参照しています。 ``` console.log('test'); ``` は ``` window.console.log('test'); ``` と同じになります。 これがどういうことになるかと言うと、 もし、書いたコードの中で、`console`という変数宣言をしてオブジェクトを代入したりすると、 ``` var console = {}; ``` 標準の`window.console`を上書きしてしまうため、以降、`console.log`が使えなくなります。 なお、functionの中で書いた分にはグローバルオブジェクトを置き換えないので大丈夫です。 ``` function a() { var console = {}; //これは大丈夫 } ``` このように、グローバルオブジェクトを書き換えたりしてしまうことは、 どういう不具合を引き起こすか予測できないため危険なのですが、 `var`は意図せずに置き換えてしまう可能性が高かったので、 より安全に変数宣言できる仕組みとして、`let`が作られた、ということになります。 現在では、`var`を使うこと自体が推奨されておらず、 全て`let`で事足りるはずですので、とにかく`let`を使うと覚えておけば問題は無いでしょう。