スコープに基づいたJavaScriptの変数シャドウイングを理解するのに苦労しています。この小さなコードフラグメントを考えてみましょう。
var k = {
prop1: 'test',
prop2: 'anotherTest'
}
for(var k = 0; k < 10; k++) {
console.log(k);
}
//prints number
console.log(typeof k);
//prints 10
console.log(k);
//undefined
console.log(k.prop1);
これは問題ありません。これは、即時関数スコープのために、ループカウンター変数kが先にデクレートしたjson変数kをシャドウするためです。したがって、json変数kは、いわばアクセスできなくなります。
質問:
- メモリ割り当てに関して、元のjson var kにアクセスする方法がなくなったので、ガベージコレクションの対象になりますか?割り当てられたメモリは解放されますか?または、「reference-孤立した」変数はまだ存続していますか?はいの場合、なぜ、どのくらいの期間ですか?
- forループの前にコードを記述せずに元のjsonvarkにアクセスする方法はありますか?
次に、わずかに変更された別のコードフラグメントについて考えます。
var k = {
prop1: 'test',
prop2: 'anotherTest'
}
var m = {
prop1: k
}
for(var k = 0; k < 11; k++) {
console.log(k);
}
//prints number
console.log(typeof k);
//prints 10
console.log(k);
//undefined
console.log(k.prop1);
//reference altered? No, this reference points to the original json k
//firebug dumps object to console
console.log(m.prop1);
質問:
- 今回は、別のjsonオブジェクトで、元のkへの参照を事前に保持します。そして確かに、メモリは割り当て解除されません。しかし、m.prop1を評価すると、値が10の更新された整数kに解決されませんか?この解像度が値10のループカウンターにつながっていないのはなぜですか?