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 相关文章推荐
JavaScript中获取元素索引的函数
Sep 10 Javascript
jquery $.getJSON()跨域请求
Dec 21 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 Javascript
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 Javascript
JS字符串的切分用法实例
Feb 22 Javascript
jQuery+Ajax实现限制查询间隔的方法
Jun 07 Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
Aug 15 jQuery
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
layui复选框限制选择个数的方法
Sep 18 Javascript
vue实现二级导航栏效果
Oct 19 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项目的方法
2006/10/09 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
处理单名多值表单的详解
2013/06/08 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
OpenCV 模板匹配
2019/07/10 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
司马光教学反思
2014/02/01 职场文书
医疗纠纷协议书
2014/04/16 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL