更换文档正文时是否收集了内联javascript垃圾?

时间:2015-07-23 16:07:00

标签: javascript html garbage-collection

考虑我有以HTML编写的以下网页(仅限正文部分):

<body>
    <p>
        ...
    </p>

    <script>
        function fn() {
            // do stuff
        }
    </script>
</body>

现在,如果我用JavaScript替换innerHTML的{​​{1}},请使用div,以便身体部分变为:

document.body

...如果对于垃圾收集的<body> <div> ... </div> </body> 对象符合,如果在其余代码(任何上下文)中没有任何对它的引用存在?

2 个答案:

答案 0 :(得分:1)

刚试过这个,有趣的是,没有。

http://jsfiddle.net/wah754La/1/

测试代码:

体:

<script type="text/javascript">
    function foo () {
        // i exist!
    }
</script>

并在加载时运行:

document.body.innerHTML = '';
console.log(foo);
// logs 'function foo()'

答案 1 :(得分:1)

如果没有从任何上下文中对其进行其他引用,它将受到垃圾收集的影响。但是,有一个小引用持有该函数,即全局窗口对象。这是因为函数(以及所示的整个脚本部分)是全局范围的。即使整个document.body的innerHTML被替换,该引用仍将存在

只有几种方法可以从全局对象中释放您的确切示例中显示的对象,并使其符合条件进行收集。删除全局对象上的属性不是一个选项,因为它被声明为函数而不是属性。

  • 使用其他内容覆盖全局对象上的属性。 window.fn = [][0];(未定义的快捷方式)
  • 离开页面,以便全局对象符合垃圾回收条件。

关于垃圾收集的快速说明,它发生在浏览器认为有必要时,并且在对象没有引用后立即(或者至少,通常不会 - 这可能发生在时间到时间)。