Heim > Fragen und Antworten > Hauptteil
var user = { name: 'tom', age: 20, gender: 'male' }
var test = document.getElementById('test');
test.onclick = function() {
test.innerHTML = user.name;
}
user = null; // 释放对象
Ich bin kürzlich auf eine solche Interviewfrage gestoßen. Gibt es in diesem Absatz einen Speicherverlust? Wenn ja, könnte mir bitte jemand erklären, warum und wie dieser Speicherverlust behoben werden kann
给我你的怀抱2017-05-19 10:44:35
内存泄漏简单的说就是分配的内存既不能使用,又不能回收,直到浏览器进程结束。
对于循环引用问题直接消除引用就好,设置test=null
,因为js
垃圾回收机制会周期的执行,找出不再使用的变量,然后释放掉其占用的内存.
垃圾回收
仅有的幸福2017-05-19 10:44:35
原理就是下面这张图,你的test就是图里的elem,引用一个dom元素,并添加一个事件处理器给这个dom元素,但事件处理的函数又引用了外部作用域的test,这样就照成了循环引用。
会照成内存泄露的其实是test而不是user,将外部的test的引用清空即可破坏这个循环引用。
这些其实在现代浏览器中由于标记-清除算法的使用都不会有问题了,旧浏览器因为垃圾回收算法只有于引用才会导致内存泄露,即循环引用导致对象不可用之后仍无法被垃圾回收。
巴扎黑2017-05-19 10:44:35
肯定有,CVTE的面试题里面有这个。因为click事件里面保留了对user.name的引用,所以还是会有泄露的。
如何消除的问题,我能想到的也只有高程上说的直接解除引用了