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 相关文章推荐
索趣科技的答案
Feb 07 Javascript
提高网站信任度的技巧
Oct 17 Javascript
jQuery 源码分析笔记(3) Deferred机制
Jun 19 Javascript
jquery tab插件精简版分享
Sep 10 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
jsp+javascript打造级连菜单的实例代码
Jun 14 Javascript
javascript中比较字符串是否相等的方法
Jul 23 Javascript
JavaScript 匿名函数和闭包介绍
Apr 13 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
Mar 07 Javascript
vue操作动画的记录animate.css实例代码
Apr 26 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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发送短信验证码完成注册功能
2015/11/24 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
微信小程序支付PHP代码
2018/08/23 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
简单谈谈python的反射机制
2016/06/28 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
Python中正则表达式的用法总结
2019/02/22 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
django 环境变量配置过程详解
2019/08/06 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
python 实现音频叠加的示例
2020/10/29 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
白色公司:The White Company
2017/10/11 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
七年级生物教学反思
2014/01/30 职场文书
安全教育演讲稿
2014/05/09 职场文书
员工安全生产承诺书
2014/05/22 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
怎样写家长意见
2015/06/04 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书