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 相关文章推荐
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
基于JQuery 选择器使用说明介绍
Apr 18 Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
jquery弹出遮掩层效果【附实例代码】
Apr 28 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
基于 Vue 实现一个酷炫的 menu插件
Nov 14 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
Sep 16 Javascript
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 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
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
js 省地市级联选择
2010/02/07 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
python计算圆周率pi的方法
2015/07/11 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
python实现滑雪游戏
2020/02/22 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
如何基于Python按行合并两个txt
2020/11/03 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
C语言基础笔试题
2013/04/27 面试题
教师考察材料范文
2014/06/03 职场文书
结婚老公保证书
2015/02/26 职场文书
产品调价通知函
2015/04/20 职场文书