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