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 相关文章推荐
File文件控件,选中文件(图片,flash,视频)即立即预览显示
Apr 09 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 Javascript
JavaScript中switch语句的用法详解
Jun 03 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
JS+CSS实现简易实用的滑动门菜单效果
Sep 18 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
JavaScript 深层克隆对象详解及实例
Nov 03 Javascript
JS双击变input框批量修改内容
Dec 12 Javascript
简单实现js无缝滚动效果
Feb 05 Javascript
原生js和css实现图片轮播效果
Feb 07 Javascript
vue通过路由实现页面刷新的方法
Jan 25 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
js实现搜索栏效果
2018/11/16 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
Python_LDA实现方法详解
2017/10/25 Python
Python面向对象编程基础实例分析
2020/01/17 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
幼师专业毕业生自荐信
2013/09/29 职场文书
急诊科护士自我鉴定
2013/10/14 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
银行授权委托书范本
2014/10/04 职场文书
承诺书范本
2015/01/21 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书