Chrome的JavaScript垃圾回收是否有所不同?

9
当我尝试调试这段代码(http://jsfiddle.net/QWFGN/)时,出现了问题。
var foo = (function(numb) {
    return {
        bar: function() {
            debugger;
            return "something";
        }
    }
})(1);
foo.bar()

Chrome浏览器中的开发者工具与Firefox中的Firebug和IE中的开发者工具有所不同。问题在于变量numbdebugger;行上在Chrome开发者工具中不可见,但在Firebug和IE中可见。如果我尝试在Chrome控制台中键入numb,则会得到以下结果:

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 作为响应。

所以,我的问题是:为什么只有 Google Chrome 看不到从未使用的闭包变量? Google Chrome 是否有自己的垃圾回收实现,或者它只与 Google Chrome 的调试工具实现相关。


1个回答

8

这与垃圾回收或调试工具无关。

实际上,Chrome的JS引擎意识到你在函数内从未使用numb,因此根本不包含它在闭包中。

请注意,只有证明内部函数从未使用with或调用eval才能这样做。


2
抱歉打扰,不知是否能提供一些官方来源的链接?这将非常有帮助! - Sebas
显然@SLaks是正确的,在V8文档中很难确定这一点。类似的讨论得出了相同的结论-> http://comments.gmane.org/gmane.comp.lang.javascript.v8.general/678 - Haris Krajina
谢谢回答。这是我找到的一些参考资料:http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-2-lexical-environments-ecmascript-implementation/#codeevalcode-and-inner-functions-may-break-optimizations,https://twitter.com/erikcorry/status/53901976865476608。如果有人找到了V8文档中指定的链接,我会非常感激。 - dugokontov
1
@dugokontov,这个没有文档,因为这是一个实现细节。你可以阅读作用域分配代码来了解实际发生的情况:https://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/scopes.cc?r=13781#1179 - Vyacheslav Egorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接