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