Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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中的HTML元素以避免内存泄漏_Javascript_Html_Memory Management - Fatal编程技术网

删除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

我最近接触了javascript,我的html编码技能有些欠缺。话虽如此,我遇到了一些在javascript中可以找到的有趣的事情。由于javascript和html的频繁使用,我恐怕造成了内存泄漏

在本例中,我想创建自己的自定义javascript警报样式/确认框。最后,我通过javascript有效地创建了一个html覆盖。选择完成后,我将删除该覆盖

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函数中使用局部变量