グローバルで let しないほうがいい
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ var と違って let/const は window のプロパティにならない
◆ 直接変数名でアクセスすると let / const 宣言した法を優先
◆ されてないと window のプロパティを見る
◆ window のプロパティのほうがみたいなら window. をつければ見れる
◆ Edge だと window のプロパティを優先するから let 宣言したほうはアクセスできない
◆ 直接変数名でアクセスすると let / const 宣言した法を優先
◆ されてないと window のプロパティを見る
◆ window のプロパティのほうがみたいなら window. をつければ見れる
◆ Edge だと window のプロパティを優先するから let 宣言したほうはアクセスできない
グローバルで変数宣言することは window のプロパティを作るのと一緒です
当たり前ですよね
でも let や const だと違う動きになります
let で作った変数は window のプロパティではありません
単に aaa と参照すれば let のほうが参照され window.aaa とすれば window のプロパティのほうが参照されます
先に window のプロパティを作った場合は
let 宣言されるまでは bbb で window.bbb が参照できます
let で宣言されてからは let で宣言されたほうが bbb で参照されます
var と違って グローバル(window)のプロパティじゃなく別のものになるので注意が必要ですね
グローバル変数を参照するときは window をつける癖があるとハマります
こういうグローバルとスコープ内を同じ名前同じにしていて window を参照してグローバルのほうに保存する処理があると単純に let は使えません
グローバルならスコープ気にしなくていいので let なしで var にすればおっけいなんですけど const だとそうはいかないんですよね
変更されたくないから const でグローバルに宣言しておくものはあるかと思います
writable:false で window のプロパティを作ることもできますが せっかく const というシンプルな構文があるのに使わないのももったいないので const なものは window. をつけないように気をつける のが一番いいのかな
まとめると
Edge のうごきをみてましょう
aaa や bbb でアクセスすると let で宣言したほうではなく window のプロパティが優先されます
なので let 宣言したほうは見ることができません
IE からマシになったと思ったのに 細かい違いがあるのは相変わらず というところです
var aaa = 100
window.aaa
// 100
aaa
// 100
window.bbb = 200
window.bbb
// 200
bbb
// 200
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
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
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
}
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.aaa
// undefined
window.aaa = "WINDOW"
window.aaa
// "WINDOW"
aaa
// WINDOW
window.bbb = "WINDOW"
bbb
// WINDOW
let bbb = "LET"
bbb
// WINDOW
window.bbb
// WINDOW
bbb
// WINDOW
let bbb = "LET"
bbb
// WINDOW
window.bbb
// WINDOW
aaa や bbb でアクセスすると let で宣言したほうではなく window のプロパティが優先されます
なので let 宣言したほうは見ることができません
IE からマシになったと思ったのに 細かい違いがあるのは相変わらず というところです