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 相关文章推荐
Javascript 继承实现例子
Aug 12 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
Sep 20 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
pace.js页面加载进度条插件
Sep 29 Javascript
编写高性能Javascript代码的N条建议
Oct 12 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
vue 实现 rem 布局或vw 布局的方法
Nov 13 Javascript
浅谈webpack和webpack-cli模块源码分析
Jan 19 Javascript
学前端,css与javascript重难点浅析
Jun 11 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 17 Javascript
js数组的基本使用总结
Jan 18 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 Image Resize图片大小调整的函数代码
2011/01/17 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
js 手机号码合法性验证代码集合
2012/09/29 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Python简单实现区域生长方式
2020/01/16 Python
python3 logging日志封装实例
2020/04/08 Python
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
大学生物业管理求职信
2013/10/24 职场文书
医学院毕业生自荐信
2013/11/08 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
批评与自我批评材料
2014/02/15 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
信息技术课后反思
2014/04/27 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android