考虑我有以HTML编写的以下网页(仅限正文部分):
<body>
<p>
...
</p>
<script>
function fn() {
// do stuff
}
</script>
</body>
现在,如果我用JavaScript替换innerHTML
的{{1}},请使用div,以便身体部分变为:
document.body
...如果对于垃圾收集的<body>
<div>
...
</div>
</body>
对象符合,如果在其余代码(任何上下文)中没有任何对它的引用存在?
答案 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];
(未定义的快捷方式)关于垃圾收集的快速说明,它发生在浏览器认为有必要时,并且在对象没有引用后立即不(或者至少,通常不会 - 这可能发生在时间到时间)。