js闭包所用的场合以及优缺点分析


Posted in Javascript onJune 22, 2015

先上段代码:

//函数a
function a()
{
var i=0;
//函数b
function b()
{
alert(++i);
}
return b;
}
//函数c
var c = a();
c();

代码特点:

1、函数b嵌套在函数a内部;
2、函数a返回函数b。
代码中函数a的内部函数b,被函数a外面的一个变量c引用的时候,这就叫创建了一个闭包。有时候函数b也可以用一个匿名函数代替来返回,即return function(){};

优点:1.保护函数内的变量安全,加强了封装性 2.在内存中维持一个变量(用的太多就变成了缺点,占内存)
闭包之所以会占用资源是当函数a执行结束后, 变量i不会因为函数a的结束而销毁, 因为b的执行需要依赖a中的变量。
不适合场景:返回闭包的函数是个非常大的函数

闭包的典型框架应该就是jquery了。

闭包是javascript语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
这在做框架的时候体现更明显,有些方法和属性只是运算逻辑过程中的使用的,不想让外部修改这些属性,因此就可以设计一个闭包来只提供方法获取。

闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

总结一下:

优点:

1. 逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。
2. 方便调用上下文的局部变量。
3. 加强封装性,第2点的延伸,可以达到对变量的保护作用。

缺点:

闭包有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生,看下面的例子:

var array = [];
function abc() {
var foo = function(){
}
array.push(foo);
return foo;
}
for(var i = 0 ; i < 10000; i ++)
{
abc();
}

alert(array[0] == array[1]);

通过上面的测试我们会看到这一万次abc()执行所产生的同一个逻辑的闭包的地址并不相同,也就是说它生产了一堆的一模一样的Function对象,这样有好处就是可以以工厂模式产生函数以备使用,然而如果你的稍有不慎将闭包当做常态逻辑使用,就不可避免的会造成内存垃圾。当中换个语法可能更好理解:

var foo = new Function();

所以关于闭包,就我自己的习惯而言,能不用就不用,如果非用不可,那就想办法保持闭包对象的数量很少甚至唯一。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
利用jQuery 实现GridView异步排序、分页的代码
Feb 06 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
Apr 03 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
JavaScript处理解析JSON数据过程详解
Sep 11 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
JS实现商品橱窗特效
Jan 09 Javascript
原生js 实现表单验证功能
Feb 08 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 #Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 #Javascript
浅谈javascript构造函数与实例化对象
Jun 22 #Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 #Javascript
jQuery实现文本框输入同步的方法
Jun 20 #Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
Jun 19 #Javascript
jquery实现的代替传统checkbox样式插件
Jun 19 #Javascript
You might like
重置版游戏视频
2020/04/09 魔兽争霸
一段php加密解密的代码
2006/10/09 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
js控制table合并具体实现
2014/02/20 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
jquery获取input输入框中的值
2019/11/13 jQuery
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
深入解析Python编程中super关键字的用法
2016/06/24 Python
python中执行shell的两种方法总结
2017/01/10 Python
Python函数装饰器实现方法详解
2018/12/22 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
业绩倒数第一的检讨书
2014/09/24 职场文书
就业协议书范本
2014/10/08 职场文书
清洁员岗位职责
2015/02/15 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
财务人员入职担保书
2015/09/22 职场文书
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android