我正在使用Chrome调试jQuery代码,但我遇到了范围问题 这是我的代码:
var foo = "bar";
$.each([1], function(key, value) {
console.log(foo);
console.log("Test");
});
如果我在第二个console.log
之前放置一个断点,我可以在Closure变量中看到foo
。但是如果我之前评论该行(因此不向控制台输出foo
),当我在断点处停止时foo
变量丢失(事实上,缺少整个Closure级别的变量)。我在Chrome和Firefox中测试了这段代码,它具有相同的奇怪行为
这就像将变量输出到控制台“将”存储在一个新的Closure级别中并公开这些变量。
我错过了什么吗?
编辑:Bergi向我指出了正确的答案(见garbage collection with node.js)
总结一下,当我评论第一个console.log
时,foo
变量从未在each
回调中使用,V8编译器会立即使其无法访问。如果我想在调试时检查它,我必须在某处使用它,例如:
var foo = "bar";
$.each([1], function(key, value) {
console.log("Test");
function test() { console.log(foo); }
});
这样,如果我停在第一个console.log
,我可以按预期检查变量
我也可以使用with
语句(但它已被弃用,因此这可能不是接近它的正确方法^ _ ^):
var foo = "bar";
with(foo) {
$.each([1], function(key, value) {
console.log("Test");
});
}
链接的答案是关于V8的,但我认为SpiderMonkey(Firefox的JS引擎)的行为方式相同。