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中的一些定位属性[图解]
Jul 14 Javascript
javascript中xml操作实现代码
Nov 21 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
JavaScript之Object类型介绍
Apr 01 Javascript
js模拟淘宝网的多级选择菜单实现方法
Aug 18 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
Jul 24 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
javascript中call,apply,bind的区别详解
Dec 11 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 判断常量,变量和函数是否存在
2009/04/26 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
详解json在php中的应用
2018/09/30 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
python入门教程 python入门神图一张
2018/03/05 Python
python如何对实例属性进行类型检查
2018/03/20 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
python里运用私有属性和方法总结
2019/07/08 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
密封类可以有虚函数吗
2014/08/11 面试题
python学习之panda数据分析核心支持库
2021/05/07 Python
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
js不常见操作运算符总结
2021/11/20 Javascript
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL