function main(){
    var str = new Array(1000).join(new Array(5000).join("xxxxx"));
    return function(){
        var arr = [];
        arr.push(str);
        }
    }            //这里内存无异常  用sIEve 显示为 19000+
var other = main();    //这里内存开始一场 显示为 68000+
other = null;       //这里内存还原 显示为19000+
(function(){
    var str = new Array(1000).join(new Array(5000).join("xxxxx"));
    document.getElementById("add").onclick = function(){
        var arr = [];
        arr.push(str);
        }          //这里内存就就异常了 显示 68000+
  document.getElementById("add").onclick = null; //这里显示为正常 19000+ })();
/*
* 要写在不同环境中内存才能正确的被释放.
*/
(function(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); var add = document.getElementById("add"); add.onclick = function(){ var arr = []; arr.push(str); } })(); (function(){ var det = document.getElementById("det"),add = document.getElementById("add"); det.onclick = function(){ add.onclick = null; } })();
/*
* 2012.12.26
* 对于内存回收,在函数中的局部变量在函数结束的时候会被垃圾回收机制回收内存, 全部变量是否就是不在函数内的变量呢, 比如,下面的变量A,当然还有页面内的各种元素.
* 由于变量A是个全局变量,所以他所占的内存是不会被施放的,也就解释了为什么函数main中的变量str所占的内存没有被回收,如果按照写法二,是不会出现内存问题的.
* 一个函数既是一个环境,最大的环境是window,内存的回收是按照一个环境一个环境来施放的.[当这个环境中,全局变量所有的引用都断开的话,此环境就会被施放内存];
*/
function
main(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); return function(){ var arr = []; arr.push(str); str = null }; }
var a = main(); 
  a();

写法二:
~function(){
  var a = main();
  a();

}()
/*
* 2013.1.6 变量arg2被引用,arg1没被引用,所以arg1所占的内存还是会被回收;
* 结论; 局部变量只有被全局变量所引用内存才不会施放.不然还是回被垃圾回收机制回收内存.
*/
var
add = document.getElementById('add'); var det = document.getElementById('det'); function main(){ var arg1 = new Array(1000).join(new Array(5000).join("xxxxx")); var arg2 = 2; gg = function(){ arg2++; } return function(){ alert(arg2); gg(); } } var aa = main(); gg(); add.onclick = function(){ aa(); }

 2013.2.16

<meta http-equiv="X-UA-Compatible" content="IE=edge">
这句会导致sIEve-0.0.8.exe内存无法被正确施放.

 

/*
* 这里的内存要清除,需要断开两个事件引用.或者强制把局部变量 str = null; 清空!!
*/
(function(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); var det = $("#det"),add = $("#add"); add.bind("click",function(){ var arr = []; arr.push(str); }); det.bind("click",function(){ add.unbind("click"); det.unbind("click"); }); })();

 2013.2.27 分离写法;虽然麻烦但是调理清晰;

var demo = $.Class.creat();
demo.prototype = {
    init:function(){
        this.opat = {
            add:null,
            det:null
            };
        $.Object.extend(this.opat,arguments[0]||{});
        this.fire();
    },
    fire:function(){
        var _this = this, _opat = _this.opat;
        var add = _this.add = $(_opat.add);
        var det = _this.det = $(_opat.det);
        _this.bind_add();
        _this.bind_det();
    },
    bind_add:function(){
        var _this = this, _opat = _this.opat;
        var add = _this.add;
        var str = new Array(1000).join(new Array(5000).join("xxxxx"));
        add.bind("click",function(){
            var arr = [];
            arr.push(str);
        });
    },
    bind_det:function(){
        var _this = this, _opat = _this.opat;
        var add = _this.add;
        var det = _this.det;
        det.bind("click",function(){
            add.unbind("click");
        });
    }
}
new demo({
    add:"#add",
    det:"#det"
})

 

 

 

 

 

posted on 2012-10-29 22:25  somesayss  阅读(3358)  评论(0编辑  收藏  举报