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 代码优化点滴记录
Feb 19 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
JQuery+CSS实现图片上放置按钮的方法
May 29 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 jQuery
vue实现的请求服务器端API接口示例
May 25 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
php列出一个目录下的所有文件的代码
2012/10/09 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
python通过smpt发送邮件的方法
2015/04/30 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Django 路由控制的实现
2019/07/17 Python
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
客服专员岗位职责范本
2013/11/29 职场文书
初中美术教学反思
2014/01/29 职场文书
卫生系统先进事迹
2014/05/13 职场文书
文艺演出策划方案
2014/06/07 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
党组织结对共建协议书
2016/03/23 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server