javascript - 这是内存泄漏吗?

时间:2016-05-08 15:36:57

标签: javascript jquery html ajax memory-leaks

我的情况并非如此,但概念非常相似,我有一个内容可以通过ajax加载,里面有一个脚本。

page1.html:

<div id="ajax-content"></div>
<button onclick="loadContent()">do ajax</button>
<script>
function loadContent() {
  $.get('page2.html', function(response) {
      $("#ajax-content").html(response);
  });
}  
</script>

page2.html:

<button id="btn">button</button>
<script>
(function() {
  var MyModule = {
      main: function() {
        $("#btn").click(function(){ 
            alert("btn click"); 
            // some code
        });
      }
      // some more functions...
  };    
  MyModule.main();
})();
</script>

假设&#34;做ajax&#34;按钮将被多次点击。
[每次点击都会从服务器加载内容,我希望经常刷新内容。 ]
 加载的页面(page2.html)中包含一些交互式小部件,因此脚本标记将被加载并在那里执行 正如您所看到的,我将第2页中的所有代码放在自调用函数(模块模式)中,因为我不想污染全局范围。
由于每个ajax请求都会再次调用脚本,因此会多次创建MyModule,并且我不确定之前的副本是否会获得GC编辑。
所以我在这里想到了这是怎么回事,告诉我我是不是错了 -

  1. 按钮&#34;做ajax&#34;按下(page1.html),该函数加载page2.html的内容,并将结果放在div中。
  2. 执行自调用函数,创建MyModule。我的模块中的main函数被称为
  3. main函数将事件处理程序绑定到id =&#39; btn&#39;的按钮。 所以现在我们有这些参考: btn - &gt;处理程序 - &gt;所有自我调用功能范围。
  4. 现在这里我不确定:如果我删除了ID =&#39; btn&#39;从文档中,它的处理程序可以是GC&#39; ed =&gt;整个自我调用功能范围将是GC&#39; ed 如果我是正确的,因为每个ajax调用都将替换div[id='ajax-content']的html,所以不会发生内存泄漏。

1 个答案:

答案 0 :(得分:1)

TL; DR:在理想的浏览器实现中,你不应该有内存泄漏。

匿名函数声明和调用

std::vector<std::bitset<8ul> > Bytes2Bits(QByteArray bytes)
{
    std::vector<std::bitset<8ul> > v;
    for(int i = 0 ; i < bytes.size(); ++i)
    {
        QByteArray temp;
        temp.append(bytes.at(i));
        std::string s = temp.toHex().toStdString();
        std::stringstream ss;
        ss << s;
        int n;
        ss >> n;
        std::bitset<8ul> b(n);
        v.push_back(b);
    }
    return v;
}

,如果单独使用,则创建Function对象并执行它。一旦它不会对其内部范围对象进行任何引用,它将在下一次GC迭代时从堆中完全清除。

但是在你的情况下,你有(function() { ... })(); - 单个引用,它将保存脚本的内部范围对象。因此,在$("#btn").click(function(){...}) DOM元素存在之前,这些对象将被DOM挂钩。

如果您要删除#btn并删除#btn DOM元素本身,那么GC将能够完全清除您的动态脚本。

只是不要将这些临时对象的引用放入全局集合中(WeakMap就可以了)。如果没有对此类集合进行适当的维护(例如,移除未使