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 相关文章推荐
延时重复执行函数 lLoopRun.js
May 08 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
容易被忽略的JS脚本特性
Sep 13 Javascript
使用jquery实现图文切换效果另加特效
Jan 20 Javascript
jquery监听div内容的变化具体实现思路
Nov 04 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
jquery获取元素索引值index()示例
Feb 13 Javascript
node.js操作mongoDB数据库示例分享
Nov 26 Javascript
微信JS SDK接入的几点注意事项(必看篇)
Jun 23 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
使用rollup打包JS的方法步骤
Dec 05 Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
PHP对象实例化单例方法
2017/01/19 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
js实现密码强度检验
2017/01/15 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python实现淘宝购物系统
2019/10/25 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python之字典添加元素的几种方法
2020/09/30 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
生日寿宴答谢词
2014/01/19 职场文书
党员创先争优承诺书
2014/03/26 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
Redis过期数据是否会被立马删除
2022/07/23 Redis