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 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
javascript实用小函数使用介绍
Nov 11 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
微信小程序遍历Echarts图表实现多个饼图
Apr 25 Javascript
vue2.0项目集成Cesium的实现方法
Jul 30 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
原生JS实现九宫格抽奖
Sep 13 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
JavaScript 基础问答三
2008/12/03 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
linux 下实现python多版本安装实践
2014/11/18 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
django缓存配置的几种方法详解
2018/07/16 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
新品发布会策划方案
2014/06/08 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
mysql优化
2021/04/06 MySQL
Python机器学习之KNN近邻算法
2021/05/14 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL