考虑我有以下用HTML编写的网页(仅正文部分):
<body>
<p>
...
</p>
<script>
function fn() {
// do stuff
}
</script>
</body>
现在,如果我将JavaScript中
innerHTML
的document.body
替换为div,那么主体部分将变为:<body>
<div>
...
</div>
</body>
...如果在代码的其余部分(任何上下文)中不存在对
fn
对象的引用,则该对象是否有资格进行垃圾回收? 最佳答案
如果未从任何上下文中对其进行任何其他引用,则将对其进行垃圾回收。但是,只有一个小引用可以使用该函数(全局窗口对象)。这是因为该函数(以及所示的整个脚本部分)是全局作用域的。即使整个document.body的innerHTML被替换,此引用仍然存在。
只有几种方法可以将确切示例中显示的对象从全局对象中释放出来,并使其有资格进行收集。删除全局对象上的属性不是一种选择,因为它被声明为函数而不是属性。
window.fn = [][0];
(未定义的快捷方式)关于垃圾收集的快速说明,它发生在浏览器认为有必要的时候,而不是在对象没有引用之后立即出现(或者至少在通常情况下不存在,这可能会不时发生)。
关于javascript - 替换文档正文时是否收集了内联JavaScript垃圾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31592655/