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

Is inline javascript garbage collected when document body is replaced?

考虑一下我用 HTML 编写了以下网页(仅正文部分):

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

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

现在,如果我将 JavaScript 中的 document.bodyinnerHTML 替换为 div,那么正文部分将变为:

<body>
    <div>
        ...
    </div>
</body>

... 如果在其余代码(任何上下文)中的任何地方都不存在对它的引用,那么 fn 对象 是否符合 垃圾收集的条件?

刚刚测试了一下,有趣的是,没有。

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

测试代码:

正文:

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

加载时,这是 运行:

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

如果没有从任何上下文中对它进行其他引用,它将被垃圾回收。但是,有一个小引用保留了该函数,即全局 window 对象。这是因为函数(和显示的整个脚本部分)是全局范围的。即使 整个 document.body 的 innerHTML 被替换,此引用仍然存在

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

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

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