删除JavaScript中的HTML元素以避免内存泄漏
我最近接触了javascript,我的html编码技能有些欠缺。话虽如此,我遇到了一些在javascript中可以找到的有趣的事情。由于javascript和html的频繁使用,我恐怕造成了内存泄漏 在本例中,我想创建自己的自定义javascript警报样式/确认框。最后,我通过javascript有效地创建了一个html覆盖。选择完成后,我将删除该覆盖删除JavaScript中的HTML元素以避免内存泄漏,javascript,html,memory-management,Javascript,Html,Memory Management,我最近接触了javascript,我的html编码技能有些欠缺。话虽如此,我遇到了一些在javascript中可以找到的有趣的事情。由于javascript和html的频繁使用,我恐怕造成了内存泄漏 在本例中,我想创建自己的自定义javascript警报样式/确认框。最后,我通过javascript有效地创建了一个html覆盖。选择完成后,我将删除该覆盖 var输出; var createPromotionBox=函数(){ var选择=“”; var b=document.getElemen
var输出;
var createPromotionBox=函数(){
var选择=“”;
var b=document.getElementById('button-container');
var-box=document.createElement('div');
setAttribute('id','alert box');
setAttribute('class','alert');
b、 附属物(盒);
var text=document.createElement('div');
setAttribute('class','alert-content');
setAttribute('id','alert text');
text.innerHTML='提升你的棋子!
';
框。追加子项(文本);
var arr=['Q','N','R','B'];
用于(arr中的var i)(功能(i){
var btn=document.createElement('button');
btn.setAttribute('class','promotion-button');
btn.setAttribute('id',arr[i]+'btn');
btn.innerHTML=arr[i];
btn.onclick=函数(){
输出=arr[i];
deletePromotionBox();
};
文本。追加子项(btn);
})(i) );
};
var deletePromotionBox=函数(){
var arr=['Q','N','R','B'];
用于(arr中的var i){
移除元素(arr[i]+'btn');
}
removeElement(“警报文本”);
移除元素(“警报框”);
};
var removelement=函数(elementId){
var e=document.getElementById(elementId);
e、 parentNode.removeChild(e);
};
document.getElementById('btn')。onclick=createPromotionBox代码>
惊人的代码工作
点击我!
这不应造成内存泄漏
如果删除的元素和对的引用超出范围,则垃圾收集器应使用标记和扫描算法清除它们
您可以始终使用内存分析工具检入Chrome开发工具,请参阅
有关此操作的详细信息,请参见此操作不应造成内存泄漏
如果删除的元素和对的引用超出范围,则垃圾收集器应使用标记和扫描算法清除它们
您可以始终使用内存分析工具检入Chrome开发工具,请参阅
有关这方面的更多信息,请参见垃圾收集器用于垃圾收集的算法。Javascript使用一种称为“标记和扫描算法”的算法,在该算法中,每个可到达的对象都被保留,不可到达的对象从内存中清除
该算法分为两个阶段
1。标记
第一阶段是标记阶段,它对整个根集进行树遍历,并将根指向的每个对象标记为正在使用。这些对象指向的所有对象等都会被标记,这样,通过根集可以访问的每个对象都会被标记
2。扫掠
从头到尾扫描所有内存,检查所有空闲或使用的块;那些未标记为“正在使用”的根无法访问,它们的内存被释放。对于标记为“正在使用”的对象,将清除“正在使用”标志,为下一个循环做准备
另见:
在您的情况下,在创建b、框、文本和btn时是否存在泄漏?
否,因为当您使用removeChild
删除这些对象的可跟踪路径时,没有其他变量引用这些对象。所以垃圾收集器释放了这些对象 垃圾收集器有一些用于垃圾收集的算法。Javascript使用一种称为“标记和扫描算法”的算法,在该算法中,每个可到达的对象都被保留,不可到达的对象从内存中清除
该算法分为两个阶段
1。标记
第一阶段是标记阶段,它对整个根集进行树遍历,并将根指向的每个对象标记为正在使用。这些对象指向的所有对象等都会被标记,这样,通过根集可以访问的每个对象都会被标记
2。扫掠
从头到尾扫描所有内存,检查所有空闲或使用的块;那些未标记为“正在使用”的根无法访问,它们的内存被释放。对于标记为“正在使用”的对象,将清除“正在使用”标志,为下一个循环做准备
另见:
在您的情况下,在创建b、框、文本和btn时是否存在泄漏?
否,因为当您使用removeChild
删除这些对象的可跟踪路径时,没有其他变量引用这些对象。所以垃圾收集器释放了这些对象 这些var
s在函数完成后停止存在。所以没有,没有内存泄漏。(请注意,您的问题标题与实际问题不符)内存泄漏的确切含义是什么?如果不希望从函数外部或控制台内部访问变量,请确保在JavaScript函数中使用局部变量。函数完成后,这些变量将停止存在。所以没有,没有内存泄漏。(请注意,您的问题标题与实际问题不符)内存泄漏的确切含义是什么?如果不希望使用v,请确保在JavaScript函数中使用局部变量