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表达式中连续的 && 和 || 之赋值区别
Oct 17 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
Dec 11 Javascript
关于JavaScript中string 的replace
Apr 12 Javascript
js原生appendChild的bug解决心得分享
Jul 01 Javascript
常用的JavaScript模板引擎介绍
Feb 28 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
vue数据操作之点击事件实现num加减功能示例
Jan 19 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
May 08 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
用Vue.js在浏览器中实现裁剪图像功能
Jun 18 Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 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 页面执行时间计算代码
2008/12/04 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
用python实现的线程池实例代码
2018/01/06 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python函数和模块的使用总结
2019/05/20 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
Django实现发送邮件功能
2019/07/18 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
小学生期末评语
2014/04/21 职场文书
机关搬迁方案
2014/05/18 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
公司费用报销管理制度
2015/08/04 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
Redis 限流器
2022/05/15 Redis