Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Chrome调试器在访问闭包中的变量时未定义?_Javascript_Google Chrome_Google Developer Tools - Fatal编程技术网

Javascript 为什么Chrome调试器在访问闭包中的变量时未定义?

Javascript 为什么Chrome调试器在访问闭包中的变量时未定义?,javascript,google-chrome,google-developer-tools,Javascript,Google Chrome,Google Developer Tools,代码: y在internal的范围内,甚至只有inner2从未使用过。我在scope中检查了结果,x,y是否存在: 但当我在watch panel和console中检查变量时,我无法获得所有变量: 奇怪的是,y在范围内,但在使用调试器时没有定义。 那么,这意味着调试器不能访问当前上下文中未使用的变量,即使它在闭包中,还是仅仅是一个bug?(我的chrome版本是51.0.2704.103 m) 它与相似,但不相同。因为我的代码中的inner2确保y在闭包中。实际上,我的问题与这个问题相反。你

代码:

y
internal
的范围内,甚至只有
inner2
从未使用过。我在scope中检查了结果,
x
y
是否存在:

但当我在watch panel和console中检查变量时,我无法获得所有变量:

奇怪的是,
y
在范围内,但在使用调试器时没有定义。 那么,这意味着调试器不能访问当前上下文中未使用的变量,即使它在闭包中,还是仅仅是一个bug?(我的chrome版本是51.0.2704.103 m)


它与相似,但不相同。因为我的代码中的
inner2
确保
y
在闭包中。实际上,我的问题与这个问题相反。

你是范围优化内部机制的第一手观察者。作用域优化是检查当前作用域中使用了哪些变量,并优化对未使用变量的访问。这是因为在javascript的JIT编译生成的机器代码中,变量命名的整个概念都丢失了。但是,为了保持javascript遵从性,JIT编译器将使用的局部变量数组与每个javascript函数相关联。遵守以下代码

(函数(){
“严格使用”;
var myVariable=NaN;//|参考1|
var scopedOne=(函数(){
var myVariable=101;//|参考文献2|
返回x=>x*myVariable;
})();
var scopedTwo=(函数(){
var myVariable=-7;//|参考文献3|
返回x=>x/myVariable;
})();
log(“scopedOne(2):”,scopedOne(2));
console.log(“scopedTwo(56):”,scopedTwo(56))

})();实际上不是。区别在于“inner2()”使用了“y”。如果删除“inner2()”部分,“y”将不在闭包中,这是的情况。但有趣的是,路易斯在这个问题下的回答表明我的处境不可能。我很确定这是一样的。
内部
闭包没有引用
y
,因此它已被优化,调试器无法访问它
inner2
可以,但您不在
inner2
中。那么您的意思是
inner2
inner2
有不同的上下文和“y”在
inner2
的上下文中,但不在
inner
中?如果为真,
y
不能在范围的闭包部分。并且变量
y
可以由GC收集(因为只有
inner2
引用它,而inner2永远不会被使用或引用),所以的第三个示例不会导致内存泄漏。我的意思是
internal
inner2
可能指的是相同的上下文,它们共享一个对象,包含
x
y
。嗯,我怀疑在优化的方式中可能还有其他因素在起作用。也许您可以扩展您的问题,将其中一些信息包括在内,并对可能的答案进行澄清?
y
未提及,因此对其进行了优化。没有任何东西需要它在那里(并且可以通过调试器访问)。
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();