Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换文档体时是否收集内联javascript垃圾?_Javascript_Html_Garbage Collection - Fatal编程技术网

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

替换文档体时是否收集内联javascript垃圾?,javascript,html,garbage-collection,Javascript,Html,Garbage Collection,考虑到我有以下用HTML编写的网页(仅正文部分): 。。。那么,如果在代码的其余部分(任何上下文)中不存在对它的引用,那么fn对象是否有资格进行垃圾收集呢 测试代码: 正文: 如果没有从任何上下文对它进行其他引用,它将被垃圾收集。但是,有一个小的引用保留该函数,即全局窗口对象。这是因为函数(以及显示的整个脚本部分)的作用域是全局的。即使替换了整个document.body的innerHTML,此引用仍将存在 只有几种方法可以将示例中显示的对象从全局对象中释放出来,并使其符合收集条件。删除全局对

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


。。。那么,如果在代码的其余部分(任何上下文)中不存在对它的引用,那么
fn
对象是否有资格进行垃圾收集呢

测试代码:

正文:


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

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

  • 用其他内容覆盖全局对象上的属性<代码>window.fn=[[0](未定义的快捷方式)
  • 离开页面导航,使全局对象符合垃圾收集的条件

关于垃圾收集的快速说明,当浏览器认为有必要进行垃圾收集时会发生垃圾收集,而不是在对象没有引用之后立即发生垃圾收集(或者至少通常不会发生垃圾收集,这可能会不时发生).

函数声明创建了一个函数对象,该函数对象在语义上与
脚本
标记的内容分离,并将对该函数对象的引用存储在变量
foo
中;只要该变量持有该引用,函数对象就必须继续存在。但是,这并没有说明任何“独立”JavaScript语句是否必须以任何形式继续存在,也没有说明如果函数对象被替换,它们的任何表示是否会保持活动状态。
<body>
    <p>
        ...
    </p>

    <script>
        function fn() {
            // do stuff
        }
    </script>
</body>
<body>
    <div>
        ...
    </div>
</body>
<script type="text/javascript">
    function foo () {
        // i exist!
    }
</script>
document.body.innerHTML = '';
console.log(foo);
// logs 'function foo()'