javascript 闭包详解及简单实例应用


Posted in Javascript onDecember 31, 2016

JS 闭包详解及实例:

最近学习JS的基础知识,学习了闭包的知识点,有很多疑惑,这一段时间还是一直有在看闭包的相关知识理解就更深入了一点,下面说说我的理解。

function fn(){
  var a = 0;
  return function (){
    return ++a;
  }  
 }

如上所示,上面第一个return返回的就是一个闭包,那么本质上说闭包就是一个函数。那么返回这个函数有什么用呢?

那是因为这个函数可以调用到它外部的a这个变量。其实也就是说,return返回的是这个函数 + a这个变量

那么,我们现在再来利用这个闭包做点事情

我们不妨创建一个变量 var f = fn(); 我们如果 console.log(f) 一下就知道,这个f就是return的整个函数体,也就是  function () { return ++a;}

那么我们执行f()就相当于执行function函数了,这时,我们多次执行f()的话,返回的a数值就会一直叠加。

但是如果我们现在再创建一个变量 var f2 = fn(); 我们运行f2()的话,会发现,a的值重置了。又会从0开始了。这是为什么呢?

其实我们可以这样理解,首先闭包是一个匿名函数,现在我们将它赋予了一个变量,那么他就有名字了,那么他每次执行完以后就有地方存了。但是每个变量存的地方又不一样,他们相互不关联,所以他们就是独立的个体了,所以a得值就不同了。就当是执行了不同的函数,只是恰好函数体是一样的罢了。

那么,我们闭包的应用场景有什么呢。本来之前我也一直在想,因为我很水,所以我写代码用到闭包的地方并不是很多。但是今天在看前端的设计模式的时候看到了单例模式,想了下,这不就是闭包的一个很好的应用场景么?

比如说我现在的需求是这样的,在网页中有时候会需要遮罩层,调用的时候我就创建一个,但是你不可能每次调用创建吧,所以如果存在就用以前的,如果不存在就创建新的,但同时有可能我永远都不需要这个遮罩层,所以我也有可能一直都不需要创建。

这就是一个很典型的单例模式的场景。

那么我们怎么来实现呢。

function fn() {
  var a;
  return function() {
     return a || (a = document.body.appendChild(document.createElement('div')));
  }
 };
 var f = fn();
f();

就很简单,就是之前的代码稍微改动下就可以了。相关理解也在上面说的很清楚啦,可以仔细看看应该是能明白的。

好了,现在对闭包算是有了一点点深入的理解了。接下来还是要继续慢慢的深入,博主也会及时更新的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
静态的动态续篇之来点XML
Dec 23 Javascript
javascript 简练的几个函数
Aug 29 Javascript
js表格分页实现代码
Sep 18 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
Oct 28 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
Sep 20 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
Angular2进阶之如何避免Dom误区
Apr 02 Javascript
JavaScript中Array方法你该知道的正确打开方法
Sep 11 Javascript
vue学习笔记之slot插槽基本用法实例分析
Feb 01 Javascript
Electron整合React使用搭建开发环境的步骤详解
Jun 07 Javascript
深入理解Angularjs中的$resource服务
Dec 31 #Javascript
BootStrap Fileinput的使用教程
Dec 30 #Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 #Javascript
bootstrapValidator表单验证插件学习
Dec 30 #Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 #Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 #Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
Dec 30 #Javascript
You might like
解析PHP汉字转换拼音的类
2013/06/18 PHP
浅谈PHP变量作用域以及地址引用问题
2013/12/27 PHP
orm获取关联表里的属性值
2016/04/17 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
js读取cookie方法总结
2014/10/31 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python的装饰器使用详解
2017/06/26 Python
Python实现进程同步和通信的方法
2018/01/02 Python
python多进程实现文件下载传输功能
2018/07/28 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
keras 读取多标签图像数据方式
2020/06/12 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
如何理解transaction事务的概念
2015/05/27 面试题
员工薪酬福利制度
2014/01/17 职场文书
自荐信格式简述
2014/01/25 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
国旗下的演讲稿
2014/05/08 职场文书
放弃继承权公证书
2015/01/23 职场文书
消防隐患整改通知书
2015/04/22 职场文书