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 相关文章推荐
Prototype源码浅析 Enumerable部分(二)
Jan 18 Javascript
基于jQuery+JSON的省市二三级联动效果
Jun 05 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
JS两种类型的表单提交方法实例分析
Nov 28 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
js 两数组去除重复数值的实例
Dec 06 Javascript
javascript实现Emrips反质数枚举的示例代码
Dec 06 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
Node.js连接Sql Server 2008及数据层封装详解
Aug 27 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 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
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
如何做好总经理助理
2013/11/12 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
教师批评与自我批评
2014/10/15 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
给朋友的道歉短信
2015/05/12 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python
JavaScript实现栈结构详细过程
2021/12/06 Javascript