9

当我尝试调试此代码时(http://jsfiddle.net/QWFGN/

var foo = (function(numb) {
    return {
        bar: function() {
            debugger;
            return "something";
        }
    }
})(1);
foo.bar()

Chrome 中的开发者工具的行为不同于 Firefox 中的 Firebug 和 IE 中的开发者工具。问题是该变量在 Chrome 开发人员工具中numb 不可见debugger;。但是,它在 Firebug 和 IE 中可见。如果我尝试numb在 Chrome 的控制台中输入,我会得到:

ReferenceError: numb is not defined

numb,当然,在这个闭包中是可见的,如果我将代码更改为(http://jsfiddle.net/QWFGN/1/

var foo = (function(numb) {
    return {
        bar: function() {
            debugger;
            console.log(numb);
            return "something";
        }
    }
})(1);
foo.bar()

numb现在在 Chrome 中也可以看到,我可以得到值1作为响应。

所以,我的问题是:为什么只有谷歌浏览器看不到从未使用过的闭包变量?谷歌浏览器是否有自己的垃圾收集实现,或者它只与谷歌浏览器中调试工具的实现有关。

4

1 回答 1

8

这与垃圾收集或调试工具没有任何关系。

实际发生的是 Chrome 的 JS 引擎意识到你永远不会numb在函数内部使用,所以它根本没有将它包含在闭包中。

请注意,只有当它可以证明内部函数从不使用with或调用时,它才能这样做eval

于 2013-03-14T13:35:33.717 回答