[原创]Javascript--闭包引起的IE内存泄露
function fors(){ obj_a = obj_b; obj_b.attr = obj_a; }
function fors(){ obj_b = {}; obj_b.attr = obj_b; }
上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。
但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的。
function iememery(){ var js_obj = document.createElement("div"); js_obj.oncontextmenu = function(){ return false;} }
<body onload="iememery()">
从表面上看,没有任何循环引用。但上面是一个闭包,根据闭包的特性,内部函数有权访问外部函数的变量对象。所以当iememery()执行之后:
js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性oncontextmenu,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)
所以形成了一个,循环引用.即:
js_obj.oncontextmenu 间接引用到 js_obj
也就是说,这个对象的一个属性,又间接的引用了自己。
只要有循环引用,就会在IE下产生内存泄露。
打开你的windows任务管理器,在IE中不停刷新含有这个代码的html页面,看看Iexploer进程的内存占用情况,一直上升,且不会自动回收(降低);
解决办法:
function iememery(){ var js_obj = document.createElement("div"); js_obj.oncontextmenu = function(){ return false;};
js_obj.oncontextmenu = null;//加上这句,断开引用 }