浅谈js闭包理解


Posted in Javascript onApril 01, 2019

闭包是js中的一大特色,也是一大难点。简单来说,所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量。

闭包的三大特点为:

1、函数嵌套函数

2、内部函数可以访问外部函数的变量

3、参数和变量不会被回收。

举例来说:

function test(){
   var a=1;
   return function(){
    alert(a);
   }
  }
  var try=test();
  try();//弹出a的值

这个例子中,变量a在test方法外部是无法访问的,但test方法里面,嵌套了一个匿名函数,通过return返回,test作用域中的变量a,

可以在匿名函数中访问。并且当test方法执行后,变量a所占内存并不会释放,以达到嵌套的函数还可以访问的目的。

闭包的作用在于,可以通过闭包,设计私有变量及方法。

举例来说:在java中创建perosn类,含有私有变量name。

public class Person{
  private String name='wy';
  public Person(val){
    name=val;
  }
  public void setName(val){
    name=val;
  }
  public String getName(){
   return name;
  }
}

在js中实现类似java创建类的功能:

(function(){
      var name="wangyu";
      Person=function (val) {
        name=val;
      }
      Person.prototype.setName=function(val){
        name=val;
      }
      Person.prototype.getName=function () {
        return name;
      }
    })();
   var person1=new Person("sj");
   alert(this.name)//undefined 因为在function作用域外不能访问
   alert(person1.getName());//sj

在function里面的name,由于是在function作用域中,所以外部无法访问,但是可以通过创建person对象,调用person的方法,来达到修改和访问name值的目的,类似于java类中的私有变量,外部无法访问,只能通过类方法访问。

再看一个私有变量的例子:

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

总结:

1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

2、不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包的体现。

以上所述是小编给大家介绍的js闭包理解详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
js之onload事件的一点使用心得
Aug 14 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
Aug 07 Javascript
处理canvas绘制图片模糊问题
May 11 Javascript
详解Vue之父子组件传值
Apr 01 #Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 #Javascript
JS中的防抖与节流及作用详解
Apr 01 #Javascript
微信小程序 slot踩坑的解决
Apr 01 #Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 #Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 #Javascript
详解JavaScript中的函数、对象
Apr 01 #Javascript
You might like
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
React简单介绍
2017/05/24 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
德国网上药房:Apotal
2017/04/04 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
社会学专业学生职业规划书
2014/02/07 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
海飞丝的广告词
2014/03/20 职场文书
优秀护士演讲稿
2014/04/30 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
资金申请报告范文
2015/05/14 职场文书
大学文艺委员竞选稿
2015/11/19 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
python基础之类方法和静态方法
2021/10/24 Python