你好!
最近做扩展时遇到一个问题比较纠结,就是不清楚 closure 中的数据是否需要 delete?
将 closure 中变量置空能否提升性能?为了明了,写个简单例子说明,请高手指教!谢谢!function renderHtml( items ){
   var parent   = document.getElementById( 'container');
   
   for ( var i = 0; i < items.length; i++) {
       var a = document.createElement( 'a');
       a.setAttribute( 'href', items[i].URL);
       a.innerHTML = items[i].Title;
       parent.appendChild( a);       var img = document.createElement( 'img');
       img.setAttribute( 'src', items[i].ImgURL);
       parent.appendChild( img );       var btn = document.createElement( 'button');
       btn.innerHTML = 'click';
       parent.appendChild( btn);
       btn.click = function(){ // 形成 closure
          alert( 'hello world'):
          // 假设这个句柄中不需要 items 中数据,并且 item 中有很多数据
          // 请问是否需要 items = null 这样处理
       }
   }
}函数 renderHtml 用数组 items 生成 dom 放到页面中去,因为给生成的 dom 绑定事件形成了 闭包,假设这个 items 数据比较大,请问这种情况清空  items 会有性能提升么(比如在循环执行完后 items = null,之后 点击 btn 的 闭包中 items 就会是 null)?谢谢了。

解决方案 »

  1.   

    典型例子function a(){
     var i=0;
     function b(){
     alert(++i);
     }
     return b;
    }
    var c = a();
    c();
    c();第一次弹出0,第二次执行却弹出了1。
    第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留。
    执行闭包后,闭包内部变量会存在,至于释放的话,你既然用闭包,就是想使用内部变量,释放做什么。
    等一个作用域结束,js会自动释放的。
      

  2.   

    楼主 你这段代码有很多问题
    function renderHtml( items ){
       var parent   = document.getElementById( 'container');
       
       for ( var i = 0; i < items.length; i++) {
           var a = document.createElement( 'a');
           a.setAttribute( 'href', items[i].URL);
           a.innerHTML = items[i].Title;
         
           //!!!!!!!!!!频繁的向dom中添加节点 会导致大量的reflow和repaint
           parent.appendChild( a);       var img = document.createElement( 'img');
           img.setAttribute( 'src', items[i].ImgURL);
           //!!!!!!!!!频繁的向dom中添加节点 会导致大量的reflow和repaint
           parent.appendChild( img );       var btn = document.createElement( 'button');
           btn.innerHTML = 'click';
           parent.appendChild( btn);       //!!!!!!!!!closure会造成循环引用导致ie下的内存泄露
           btn.click = function(){ // 形成 closure
              alert( 'hello world'):
              // 假设这个句柄中不需要 items 中数据,并且 item 中有很多数据
              // 请问是否需要 items = null 这样处理
           }
       }
    }
      

  3.   

    items 是数组啊  数组啊   也是就是说 
    items是引用行的 
    不管是不是闭包  只要还保留这对数组的引用
    清空items都对没有用 在闭包引用的父函数的变量  当不在引用的时候会自动消失 
    可以查看下 垃圾回收机制
      

  4.   


    这个解释很合理啊.
    另, 如果都使用的同一方法, 完全不需要像btn.click = function(){}这样创建函数. 直接btn.click = doClick; 然后doClick中写逻辑就行了. 这样只开辟一块内存空间
      

  5.   

    高见 刚开始还没看见  真会产生内存泄露
    最后把btn设置成null
    解释地址
    http://blog.csdn.net/dead_of_winter/archive/2008/04/10/2277673.aspx
      

  6.   

    items并没有在闭包中被引用,因此在外函数体执行完成后,会被释放掉,不存在内存泄漏