asfman
android developer
posts - 90,  comments - 213,  trackbacks - 0

经ie7测试
function myButton()
{
    var container=document.createElement("button");
    /*container.style......*/
    var text=document.createElement("button");
    /*text.style......text.innerText......*/

    text.onclick=EventBuilder(container);
    //在这里无论是上面这种写法还是直接写function(){}结果占用内存都一样
    //只有直接引用外部函数如text.onclick=EventBuilder才能释放button对象,减少内存
    document.body.appendChild(container);
    document.body.appendChild(text);
    //如果onmouseover中我没有用到container 当然可以用 text=null container=null来打破循环引用
    //经测试用null打不破循环
}

function EventBuilder(container)
{
    return function(e)
    {
        alert(container)//这里container可访问
        text=this;//用this访问自身
    }
}
for(var i =0;i<5000;i++)
myButton()
//conclusion
闭包使返回的内部函数持有私有变量,所以此私有变量持有的dom对象不能被回收。
(被回收的条件:1。 没有context 2。没有被引用 )
不内部写function。把内部变量传递给外部函数闭包返回不能解决问题。
所以唯一的方法是直接引用外部函数,如text.onclick = outFunc;

posted on 2007-12-14 08:54 汪杰 阅读(366) 评论(2)  编辑 收藏 引用 所属分类: javascriptExtjquery

FeedBack:
# re: 关于泄漏
2007-12-15 13:57 | 汪杰
可能只要没有对local variables的引用,就会释放内存。
所以按winter的方法可以解决泄露吧  回复  更多评论
  
# re: 关于泄漏
2007-12-15 14:00 | 汪杰
Javascript的垃圾回收机制
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。   回复  更多评论
  
只有注册用户登录后才能发表评论。

<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(15)

随笔分类(1)

随笔档案(90)

文章分类(727)

文章档案(712)

相册

收藏夹

http://blog.csdn.net/prodigynonsense

友情链接

最新随笔

搜索

  •  

积分与排名

  • 积分 - 456697
  • 排名 - 6

最新随笔

最新评论

阅读排行榜

评论排行榜