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笔记 数据的存储与访问性能优化
Aug 02 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
js实现日期显示的一些操作(实例讲解)
Jul 27 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
VUE脚手架具体使用方法
May 20 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验证码生成类分享
2014/08/21 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
javascript常用方法总结
2015/05/14 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python中的全局变量用法分析
2015/06/09 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
python把1变成01的步骤总结
2019/02/27 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Python编写万花尺图案实例
2021/01/03 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
《和我们一样享受春天》教学反思
2014/02/07 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
新学期开学演讲稿
2014/05/24 职场文书
感谢师恩主题班会
2015/08/17 职场文书
导游词之安徽九华山
2019/09/18 职场文书