【发布时间】:2016-09-07 04:17:46
【问题描述】:
代码:
function test4() {
var x = 10;
var y = 100;
// inner referred x only
function inner () {
console.log(x);
debugger;
}
// inner2 referred y to make sure y is in the scope of inner
function inner2 () {
console.log(y);
}
return inner;
}
var foo = test4();
foo();
y 在inner 的范围内,甚至只有inner2 从未使用过的引用它。我检查了范围内的结果,x,y 在那里:
但是当我在监视面板和控制台中检查变量时,我无法获取所有变量:
奇怪的是y 在范围内但在使用调试器时没有被定义。
那么,这是否意味着调试器无法访问当前上下文中未使用的变量,即使它在闭包中还是只是一个错误? (我的 chrome 版本是 51.0.2704.103 m)
它类似于Why does Chrome debugger think closed local variable is undefined?,但不一样。因为inner2 在我的代码中确保y 在闭包中。实际上我的问题与该问题下的Louis's answer相反。
【问题讨论】:
-
实际上不是。不同之处在于“inner2()”使用了“y”。如果去掉 'inner2()' 部分,'y' 不会关闭,这是Gabe's question 的情况。但有趣的是,路易斯在这个问题下的回答表明我的情况应该是不可能的。
-
我很确定这是一回事。
inner闭包没有引用y,所以它被优化了,调试器无法访问它。inner2可以,但你不在inner2。 -
所以你的意思是
inner和inner2在inner2的上下文中有不同的上下文和'y',但在inner的上下文中没有?如果是真的,y不能在范围的封闭部分。并且变量y可以被GC收集(因为只有inner2引用它,而inner2永远不会被使用或引用)所以this的第三个例子不会导致内存泄漏。我的意思是inner和inner2可能引用相同的上下文,它们共享一个包含x和y的对象。 -
嗯,我怀疑它的优化方式可能还有其他因素在起作用。也许您可以扩展您的问题以包含其中一些信息并澄清它以获得潜在的答案?
-
y没有被引用,所以它被优化了。没有任何东西需要它存在(并且可供调试器访问)。
标签: javascript google-chrome google-developer-tools