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