javascript闭包功能与用法实例分析


Posted in Javascript onApril 06, 2017

本文实例讲述了javascript闭包功能与用法。分享给大家供大家参考,具体如下:

理解闭包

闭包这个东西,确实是很麻烦。之前我自己的理解也是有一点误差,所以今天将文章修改修改,争取将自己的理解进一步准确化。

闭包说得通熟易懂一点,就是指有权访问另一个函数作用域的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另外一个函数,并返回

我们这里举一个例子来说明,首先我们在函数f1内部定义一个函数f2。

function f1(){
  var n=999;
  function f2(){
    alert(n); // 999
  }
}

f2可以访问f1的作用域,反过来就不行了。现在我们想访问f1中的n,在外层却访问不到,怎么办呢?将f2作为f1的返回值就可以了:

function f1(){
  var n=999;
  function f2(){
    alert(n);
  }
  return f2;
}
var result=f1();
result(); // 999

这个就是闭包。

其实也很简单,那么闭包有什么用呢?

闭包的使用

之前的自己只知道闭包的概念,却并不知道其存在的价值和意义。直到自己在项目中遇到类似的问题后,才发现只有闭包才能解决的情况。

闭包是使用可以带来以下好处

1. 希望一个变量长期驻扎在内存中
2. 避免全局变量的污染
3. 私有成员的存在

我们刚才说到过,闭包可以读取到函数内部的变量,这是由于闭包后函数的堆栈不会释放,也就是说这些值始终保持在内存中。这是一个优点,也是一个缺点。

我们可以通过闭包来实现一个计数器,而不用担心全局变量的污染:

function f1(){
  var n=999;
  nAdd=function(){n+=1}
  function f2(){
    alert(n);
  }
  return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000

可以看到n一直存储在内存中,并没有在f1调用后被自动清除。

我们再来看看如何通过闭包来模拟JavaScript中的私有成员:

var aaa = (function(){
  var a = 1;
  function bbb(){
    a++;
    alert(a);
  }
  function ccc(){
    a++;
    alert(a);
  }
  return {
    b:bbb,    //json结构
    c:ccc
  }
})();
aaa.b();  //2
aaa.c();  //3

这样就可以提供指定的变量供外界访问了。

闭包解决的问题

这是一个很常见的问题,就是利用javascript处理循环的时候,索引i的值不能有效的利用:

javascript闭包功能与用法实例分析

这里改成如下格式,形成10个闭包来解决即可:

javascript闭包功能与用法实例分析

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery 操作XML入门
Dec 25 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
May 11 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
JS实现图片放大镜效果的方法
Feb 27 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
js实现对ajax请求面向对象的封装
Jan 08 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
Jan 21 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
May 11 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
Vuex modules模式下mapState/mapMutations的操作实例
Oct 17 Javascript
深入理解 JavaScript 中的 JSON
Apr 06 #Javascript
ES6中module模块化开发实例浅析
Apr 06 #Javascript
ES6中class类用法实例浅析
Apr 06 #Javascript
ES6中Proxy代理用法实例浅析
Apr 06 #Javascript
ES6中Symbol类型用法实例详解
Apr 06 #Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 #Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 #Javascript
You might like
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
php 魔术函数使用说明
2010/02/21 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
stripos函数知识点实例分享
2019/02/11 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python获取Linux发行版名称
2019/08/30 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
python属于解释语言吗
2020/06/11 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
公务员培的训心得体会
2014/09/01 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
Python字符串的转义字符
2022/04/07 Python