缺少匿名函数内的变量

时间:2014-05-28 13:07:39

标签: javascript jquery variables scope anonymous-function

我正在使用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引擎)的行为方式相同。

0 个答案:

没有答案