`
yiminghe
  • 浏览: 1471478 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

合理使用闭包

阅读更多

引:     

 

   初学函数式的脚本语言如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>
 

稳定后内存占用:

 

 

 

 

 

 

 

 

 

  • 大小: 3.6 KB
  • 大小: 4.5 KB
  • 大小: 3.3 KB
2
1
分享到:
评论

相关推荐

    js闭包个人理解

    ### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常...然而,在实际开发过程中,我们也应该注意合理使用闭包,避免出现不必要的性能问题或内存泄漏。希望本文能对你理解JavaScript闭包有所帮助。

    Javascript 闭包完整解释

    ### JavaScript闭包完整...通过合理使用闭包,可以大大提高代码的灵活性和可维护性。然而,也需要警惕闭包可能导致的内存泄漏等问题。掌握闭包的工作原理及其应用,对于深入理解和高效开发JavaScript应用程序至关重要。

    javascript里的闭包是什么 什么是闭包.zip

    合理使用闭包,避免长时间持有不需要的引用,是优化JavaScript性能的关键。 4. **模块化**:闭包可以作为实现模块化的手段,每个模块通过闭包来封装其内部逻辑和状态,对外暴露有限的接口,从而实现代码的隔离和...

    python中闭包共4页.pdf.zip

    需要注意合理使用闭包,避免内存泄漏。 7. **闭包与装饰器**:Python的装饰器本质上就是闭包的一种应用,它允许我们修改或增强已有函数的功能,而无需改变函数的源代码。 8. **闭包的局限性**:虽然闭包提供了强大...

    javascript闭包

    通过合理使用闭包,我们可以实现很多高级功能,如私有变量、延时执行等。然而,不正确的使用闭包也可能会导致内存泄漏等问题。因此,开发者在使用闭包时需要充分理解其工作原理,并注意避免潜在的问题。

    JavaScript闭包

    因此,合理使用闭包并注意及时解除引用是非常重要的。 总之,JavaScript闭包是实现复杂功能的关键工具,理解和掌握闭包对于提高编程效率和代码质量具有重要意义。在实际开发中,灵活运用闭包可以写出更加高效、优雅...

    JS闭包可被利用的常见场景1

    JavaScript 闭包是一种强大的语言特性,它允许内部函数访问并操作外部函数的变量,即使外部函数已经执行完毕。闭包的这种特性使得我们能够在多...通过合理使用闭包,我们可以构建更加健壮和灵活的JavaScript应用程序。

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    合理使用闭包可以提高代码的健壮性和可维护性。 #### 二、垃圾回收机制 JavaScript 中的垃圾回收机制负责自动管理和释放不再使用的内存。常见的垃圾回收算法包括标记清除(Mark and Sweep)、引用计数(Reference ...

    深入探讨:在嵌套函数中访问和修改外层函数变量的技巧

    在编程中,函数的嵌套使用是一种常见的模式,它允许我们创建...在实际编程中,合理使用闭包可以提高代码的灵活性和表达力,但也要小心潜在的内存泄漏和性能问题。通过掌握这些技巧,你可以编写出更加健壮和高效的代码。

    Closure闭包函数示例

    补充说明:闭包可以使用USE关键连接外部变量。 总结:PHP闭包的特性其实用CLASS就可以实现类似甚至强大得多的功能,更不能和js的闭包相提并论了吧,只能期待PHP以后对闭包支持...合理使用闭包能使代码更加简洁和精炼。

    C语言实现三种闭包算法(传递,自反,对称闭包)

    在C语言中实现这些闭包通常涉及到数组或链表等数据结构,用于存储关系,并使用迭代或递归方法来构建闭包。以下是可能的实现策略: 1. **传递闭包**:可以使用二维数组表示关系,然后遍历数组的每一行和每一列,每次...

    Sympact运行JS脚本并分析其执行时间CPU使用情况和内存使用情况

    JavaScript是Web开发中不可或缺的一部分,主要用于前端交互和服务器端编程。...在实际使用中,结合JavaScript开发的最佳实践,如避免全局变量、合理使用闭包、控制回调地狱等,可以显著提升JavaScript代码的性能。

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    4. 注意闭包的使用,确保在不再需要时释放对外部变量的引用。 总之,理解和掌握内存管理和闭包在JavaScript中的工作原理对于编写高效、无泄漏的代码至关重要。通过合理的设计、及时的解除引用以及有效的监控,可以...

    js代码-JS闭包以及优化

    2. **合理使用闭包**:不是所有场景都需要闭包,过度使用可能会增加内存消耗和复杂性。考虑是否可以用其他方法(如对象属性、类等)替代。 3. **注意作用域链**:过长的作用域链会影响性能,尽量减少嵌套,以降低...

    编写高质量代码改善JavaScript程序的188个建议(1-78).docx

    建议15:合理使用闭包 闭包可以捕获外部作用域的变量,但滥用可能导致内存泄漏。理解闭包的工作原理,适时使用。 以上是部分建议的详细解释,涵盖JavaScript的基础知识和最佳实践。遵循这些原则,可以编写出更高效...

    【经验总结】编写JavaScript代码时应遵循的14条规律

    12. **合理使用闭包**:闭包可以用来创建私有变量和封装代码,但过度使用可能导致内存泄漏。理解其工作原理并谨慎使用。 13. **优化循环**:在循环中,尽量减少不必要的计算,如在循环体外部计算循环次数或提前存储...

    sIEve与JSLeaksDetector

    - **合理使用闭包**:理解闭包的工作原理,避免创建不必要的长期存在的闭包。 - **管理全局变量**:限制全局变量的使用,尽可能使用局部变量,并在不再需要时设置为`null`。 - **利用工具**:使用sIEve和...

    S2 Acco6.0 使用JavaScript增强交互效果 课件答案

    这包括避免全局变量、合理使用闭包、利用缓存和预加载策略等。 总的来说,"S2 Acco6.0 使用JavaScript增强交互效果"的课程内容将涵盖以上各个关键点,帮助开发者深入理解如何通过JavaScript创造出引人入胜、互动性...

    JavaScript性能优化的小知识总结共23页.pdf.zip

    这包括避免全局变量、合理使用闭包以及模块化设计(如使用CommonJS或ES6模块)来减少作用域冲突和内存消耗。 2. **DOM操作优化**:频繁的DOM操作是JavaScript性能杀手之一。使用`DocumentFragment`批量处理DOM节点...

    object-literal-gc.rar_objects

    5. **内存管理最佳实践**:避免不必要的全局变量,及时解除不再使用的对象引用,合理使用闭包等都是优化内存管理的关键。 通过对这些测试用例的研究,开发者不仅可以深入理解JavaScript的对象字面量和垃圾回收机制...

Global site tag (gtag.js) - Google Analytics