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中的相等与不等运算
Apr 25 Javascript
jQuery Selector选择器小结
May 06 Javascript
js中call与apply的用法小结
Dec 28 Javascript
JS动态修改图片的URL(src)的方法
Apr 01 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
Dec 04 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
jQuery 选择同时包含两个class的元素的实现方法
Jun 01 Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
详解微信小程序开发用户授权登陆
Apr 24 Javascript
小程序实现录音上传功能
Nov 22 Javascript
js实现简单图片拖拽效果
Feb 22 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 magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python多进程操作实例
2014/11/21 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
python修改文件内容的3种方法详解
2019/11/15 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
南京某公司笔试题
2013/01/27 面试题
公司培训心得体会
2014/01/03 职场文书
元旦晚会邀请函
2014/01/27 职场文书
学习自我鉴定
2014/02/01 职场文书
中学生励志演讲稿
2014/04/26 职场文书
2014年教研室工作总结
2014/12/06 职场文书
毕业论文致谢范文
2015/05/14 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Python进程池与进程锁之语法学习
2022/04/11 Python