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 相关文章推荐
Extjs学习笔记之九 数据模型(上)
Jan 11 Javascript
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
javascript 寻找错误方法整理
Jun 15 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
Apr 14 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
Feb 22 Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
Element-UI Table组件上添加列拖拽效果实现方法
Apr 14 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
Nov 06 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
信用卡效验程序
2006/10/09 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
PHP文件操作实例总结
2016/09/27 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
Javascript函数的参数
2015/07/16 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python实现ip代理池功能示例
2019/07/05 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
QML用PathView实现轮播图
2020/06/03 Python
销售主管的自我评价分享
2014/01/03 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
体育课课后反思
2014/04/24 职场文书
个人担保书范文
2014/05/20 职场文书
大学专科求职信
2014/07/02 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python