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类中的公有变量和私有变量
Jul 24 Javascript
起点页面传值js,有空研究学习下
Jan 25 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
一个JavaScript处理textarea中的字符成每一行实例
Sep 22 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
Jan 10 Javascript
javascript日期比较方法实例分析
Jun 17 Javascript
javascript删除html标签函数cIsHTML
Jan 09 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
基于Vue生产环境部署详解
Sep 15 Javascript
React Native 搭建开发环境的方法步骤
Oct 30 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
JavaScript undefined及null区别实例解析
Jul 21 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
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
对于Python装饰器使用的一些建议
2015/06/03 Python
Python自动发邮件脚本
2017/03/31 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
体育教学随笔感言
2014/02/24 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
中标通知书范本
2015/04/17 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS