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 相关文章推荐
又一个图片自动缩小的JS代码
Mar 10 Javascript
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
用JS写的一个TableView控件代码
Jan 23 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
Aug 19 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 Javascript
Javascript将JSON日期格式化
Aug 23 Javascript
轻松掌握JavaScript单例模式
Aug 25 Javascript
vue.js获得当前元素的文字信息方法
Mar 09 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 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
香妃
2021/03/03 冲泡冲煮
PHP 图片水印类代码
2012/08/27 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
Python 制作糗事百科爬虫实例
2016/09/22 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Linux下python3.7.0安装教程
2018/07/30 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
Django values()和value_list()的使用
2020/03/31 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
应届大学生求职的自我评价
2013/11/17 职场文书
教师业务培训方案
2014/05/01 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
李强为自己工作观后感
2015/06/11 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
导游词之无锡梅园
2019/11/28 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android