引:
初学函数式的脚本语言如javascript时,觉得程序写起来很顺手,特别是随时可用的闭包,作用域链的应用到处可见,以前用静态的c++,java ,突然觉得随时可以写函数,函数可以方便引用定义处的变量是多么自由和随意。
错误模式:
但是这种编程模式并不是只有好处,代价就是急剧增长的内存占用以及稍不注意ie下细微的内存泄漏,举个极端的编程模式下内存的不正常占用:
<script>
window.onload=function(){
var memory="";
var i=0;
for(i=0;i<10000;i++)
memory+="eat memory";
setTimeout (function() {
alert("时间到了,我要做点事情。"+i);
},50000);
}
</script>
alert前稳定后的内存占用:

alert后稳定后的内存占用:

可见前后有400多k的差距,示例程序用了定时处理函数,但是那个函数并没有引用memory这个大变量,而仅仅引用了外部的一个数字变量,可以由于memory大变量存在于定时函数的作用域链中,而使得在定时函数执行前,大变量也释放不了(长时间系统大量内存不必要占用),使用闭包得不偿失。
对于这种场景,适合的做法是将自已要的变量传过去即可,避免闭包引起的大规模变量引用,当然传变量的技巧还是闭包,但是这样可以自己控制,大大减少闭包引用的变量大小。
改进模式:
<script>
var test={};
test.doo=function(i){
alert("时间到了,我要做点事情。"+i);
};
Function.prototype.createCallback=function(){
var that=this;
var args=[].slice.apply(arguments);
return function(){
that.apply(null,args);
};
};
window.onload=function(){
var memory="";
var i=1;
for(i=0;i<10000;i++)
memory+="eat memory";
setTimeout (test.doo.createCallback(i),50000);
}
</script>
稳定后内存占用:

57

被折叠的 条评论
为什么被折叠?



