【发布时间】:2012-06-20 05:25:39
【问题描述】:
我很难理解 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);
问题:
- 这一次,我们事先保存了对原始 k 的引用,在 另一个 json 对象。当然,记忆不会 取消分配。但是,不会评估 m.prop1 解析为更新 整数 k,值为 10?为什么这个决议没有导致 值为 10 的循环计数器?
【问题讨论】:
-
我不确定您的前两个问题...不确定垃圾收集在 JS 中的工作原理并假设它是特定于环境的...但是对于最后一个问题,m 没有理由指向k...当您在m的实例化中分配
prop1:k时,您将k的引用指针传递给对象m...然后当您用var k=0覆盖时,您说的是当前变量名k 应该与一个全新的对象相关联...对它的原始引用只字不提...对不起,如果我的回答令人困惑,我认为我的措辞不是很好... -
只有一个变量称为
k。变量命名对象。变量不是对象。
标签: javascript function scope