◆ var と違って let/const は window のプロパティにならない
◆ 直接変数名でアクセスすると let / const 宣言した法を優先
  ◆ されてないと window のプロパティを見る
  ◆ window のプロパティのほうがみたいなら window. をつければ見れる
◆ Edge だと window のプロパティを優先するから let 宣言したほうはアクセスできない 

グローバルで変数宣言することは window のプロパティを作るのと一緒です
var aaa = 100
window.aaa
// 100
aaa
// 100

window.bbb = 200
window.bbb
// 200
bbb
// 200

当たり前ですよね

でも let や const だと違う動きになります
let aaa = "LET"
window.aaa
// undefined
window.aaa = "WINDOW"
window.aaa
// "WINDOW"
aaa
// LET

let で作った変数は window のプロパティではありません
単に aaa と参照すれば let のほうが参照され window.aaa とすれば window のプロパティのほうが参照されます


先に window のプロパティを作った場合は
window.bbb = "WINDOW"
bbb
// WINDOW
let bbb = "LET"
bbb
// LET
window.bbb
// WINDOW

let 宣言されるまでは bbb で window.bbb が参照できます

let で宣言されてからは let で宣言されたほうが bbb で参照されます


var と違って グローバル(window)のプロパティじゃなく別のものになるので注意が必要ですね

グローバル変数を参照するときは window をつける癖があるとハマります
let someid = 100
function func(someid){
// なにかする
window.someid = someid
}

こういうグローバルとスコープ内を同じ名前同じにしていて window を参照してグローバルのほうに保存する処理があると単純に let は使えません

グローバルならスコープ気にしなくていいので let なしで var にすればおっけいなんですけど const だとそうはいかないんですよね
変更されたくないから const でグローバルに宣言しておくものはあるかと思います
writable:false で window のプロパティを作ることもできますが せっかく const というシンプルな構文があるのに使わないのももったいないので const なものは window. をつけないように気をつける のが一番いいのかな


まとめると
  • グローバルでは let 使わずに var もしくは window.
  • グローバルの const なものは window. を使わなくていいように同名のをできるだけ宣言しないようにする

Edge

終わったと思ったら終わりませんでした

Edge のうごきをみてましょう
let aaa = "LET"
window.aaa
// undefined
window.aaa = "WINDOW"
window.aaa
// "WINDOW"
aaa
// WINDOW
window.bbb = "WINDOW"
bbb
// WINDOW
let bbb = "LET"
bbb
// WINDOW
window.bbb
// WINDOW

aaa や bbb でアクセスすると let で宣言したほうではなく window のプロパティが優先されます
なので let 宣言したほうは見ることができません

IE からマシになったと思ったのに 細かい違いがあるのは相変わらず というところです