内存管理是很重要的一部分,系统分配给浏览器的内存空间很少,如果不能很好的管理内存很可能因为某个页面导致浏览器的崩溃。
虽然js有垃圾回收机制,但是在程序中如果不用的对象,要及时释放引用等待gc回收
js垃圾回收的机制
1. 标记清除
当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。
2. 引用计数
基本原理就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。
引用计数有很大的问题,因为可能有些对象的引用计数永远不可能为0,所以js都是用标记清除的方式。
但是在IE中有一部分对象并不是原生的js对象,比如BOM和DOM 使用C++以COM(Component Object Model) 对象形式存在的,而COM对象的垃圾回收策略就是采用引用计数的。因此即使IE的JS引擎使用标记清除,但是JS访问的COM对象依然是引用计数策略,也就是使用了COM对象就会存在循环引用问题。
导致内存泄漏例子
function assignHandler(){ var element = document.getElementById("se"); element.onclick = function(){ alert(element.id); } }
在匿名函数中保存了element的引用,所以element的引用次数永远不可能为0,也就是永远不可能被回收。
解决上述问题,让我们修改如下
function assignHandlers(){ var element = document.getElementById("se"); var id = element.id; element.onclick = function(){ alert(id); } element = null; }
将匿名函数要用的数据保存到assignHandler函数作用域下的临时变量中,然后将删除element对象的引用。
注:闭包会引用包含函数的整个活动对象,即使没有直接引用element,但活动对象中包含了element的引用,所以必须把element设置为null才可以。
时间: 2024-10-03 04:48:56