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 相关文章推荐
jQuery checkbox全选/取消全选实现代码
Nov 14 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
May 08 Javascript
AJAX跨域请求json数据的实现方法
Nov 11 Javascript
js中switch case循环实例代码
Dec 30 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
JS实现图片点击后出现模态框效果
May 03 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
Jan 28 jQuery
微信小程序后台持续定位功能使用详解
Aug 23 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 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、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php简单统计在线人数的方法
2016/05/10 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
python实现小球弹跳效果
2019/05/10 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
局域网标准
2016/09/10 面试题
专升本自我鉴定
2013/10/10 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
二年级语文教学反思
2014/02/02 职场文书
2014庆六一活动方案
2014/03/02 职场文书
敬老模范事迹
2014/05/21 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
力克胡哲观后感
2015/06/10 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python