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,超强推荐share.js
Dec 23 Javascript
jquery插件制作 提示框插件实现代码
Aug 17 Javascript
Jquery封装tab自动切换效果的具体实现
Jul 13 Javascript
表单元素与非表单元素刷新区别详细解析
Nov 06 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
Dec 22 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
node全局变量__dirname与__filename的区别
Jan 14 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
Dec 18 Javascript
12 种使用Vue 的最佳做法
Mar 30 Javascript
原生JS实现记忆翻牌游戏
Jul 31 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
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
oracle资料库函式库
2006/10/09 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
学习Vue组件实例
2018/04/28 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
python模块之re正则表达式详解
2017/02/03 Python
python flask实现分页效果
2017/06/27 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
学习和使用python的13个理由
2019/07/30 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
详解python中的lambda与sorted函数
2020/09/04 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
精选奢华:THE LIST
2019/09/05 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
中学生个人自我评价
2014/02/06 职场文书
2015年元旦活动总结
2014/05/09 职场文书
小学节能减排倡议书
2014/05/15 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
运动与健康自我评价
2015/03/09 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
诉讼和解协议书
2016/03/23 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
实例详解Python的进程,线程和协程
2022/03/13 Python