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 replace方法与正则表达式
Feb 19 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
Nov 30 Javascript
ajax更新数据后,jquery、jq失效问题
Mar 16 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
教你如何使用node.js制作代理服务器
Nov 26 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
Nov 18 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 Javascript
Vue实现圆环进度条的示例
Feb 06 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
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
解析vue中的$mount
2017/12/21 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
django如何连接已存在数据的数据库
2018/08/14 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
Django多个app urls配置代码实例
2020/11/26 Python
python 模拟登陆163邮箱
2020/12/15 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
幼儿园三八妇女节活动方案
2014/03/11 职场文书
总结Python使用过程中的bug
2021/06/18 Python
小程序实现侧滑删除功能
2022/06/25 Javascript