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 相关文章推荐
javascript数组的扩展实现代码集合
Jun 01 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
May 25 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
多种方法实现JS动态添加事件
Nov 01 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
js实现二级菜单点击显示当前内容效果
Apr 28 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
May 28 Javascript
解决Layui数据表格的宽高问题
Sep 28 Javascript
vue实现整屏滚动切换
Jun 29 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 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
php可变长参数处理函数详解
2017/02/22 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
几种tab切换详解
2017/02/03 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python机器学习库xgboost的使用
2020/01/20 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
本科生求职简历的自我评价
2013/10/21 职场文书
财务出纳员岗位职责
2013/11/26 职场文书
年终考核实施方案
2014/05/26 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS