我很难理解基于范围的 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,是否有资格进行垃圾回收?分配的内存会被释放吗?还是“引用孤儿”变量仍然存在?如果是,为什么以及持续多长时间?
- 有没有一种方法可以访问原始 json var k 而无需在 for 循环之前编写任何代码?
现在考虑另一个稍作修改的代码片段:
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 不会解析为更新后的整数 k,其值为 10?为什么这个分辨率不会导致值为 10 的循环计数器?