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

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

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

现在,如果我将JavaScript中innerHTMLdocument.body替换为div,那么主体部分将变为:
<body>
    <div>
        ...
    </div>
</body>

...如果在代码的其余部分(任何上下文)中不存在对fn对象的引用,则该对象是否有资格进行垃圾回收?

最佳答案

如果未从任何上下文中对其进行任何其他引用,则将对其进行垃圾回收。但是,只有一个小引用可以使用该函数(全局窗口对象)。这是因为该函数(以及所示的整个脚本部分)是全局作用域的。即使整个document.body的innerHTML被替换,此引用仍然存在。

只有几种方法可以将确切示例中显示的对象从全局对象中释放出来,并使其有资格进行收集。删除全局对象上的属性不是一种选择,因为它被声明为函数而不是属性。

  • 用其他方法覆盖全局对象上的属性。 window.fn = [][0];(未定义的快捷方式)
  • 离开页面,以便全局对象有资格进行垃圾回收。

  • 关于垃圾收集的快速说明,它发生在浏览器认为有必要的时候,而不是在对象没有引用之后立即出现(或者至少在通常情况下不存在,这可能会不时发生)。

    关于javascript - 替换文档正文时是否收集了内联JavaScript垃圾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31592655/

    10-14 14:41