JS_閉包和內存.


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"
})

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM