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 相关文章推荐
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
页面定时刷新(1秒刷新一次)
Nov 22 Javascript
javascripit实现密码强度检测代码分享
Dec 12 Javascript
jQuery中size()方法用法实例
Dec 27 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
Webpack中雪碧图插件使用详解
May 25 Javascript
node.js 微信开发之定时获取access_token
Feb 07 Javascript
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
深入理解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
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
spyder常用快捷键(分享)
2017/07/19 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
python输出pdf文档的实例
2020/02/13 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
MySQL面试题
2014/01/12 面试题
中学生校园广播稿
2014/01/16 职场文书
银行奉献演讲稿
2014/09/16 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
Python多个MP4合成视频的实现方法
2021/07/16 Python
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js