我的情况并非如此,但概念非常相似,我有一个内容可以通过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编辑。
所以我在这里想到了这是怎么回事,告诉我我是不是错了 -
main
函数被称为main
函数将事件处理程序绑定到id =&#39; btn&#39;的按钮。
所以现在我们有这些参考:
btn - &gt;处理程序 - &gt;所有自我调用功能范围。 现在这里我不确定:如果我删除了ID =&#39; btn&#39;从文档中,它的处理程序可以是GC&#39; ed =&gt;整个自我调用功能范围将是GC&#39; ed
如果我是正确的,因为每个ajax调用都将替换div[id='ajax-content']
的html,所以不会发生内存泄漏。
答案 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就可以了)。如果没有对此类集合进行适当的维护(例如,移除未使