浅谈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 相关文章推荐
jquery 最简单的属性菜单
Oct 08 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
js+html5生成自动排列对话框实例
Oct 09 Javascript
js实现右键弹出自定义菜单
Sep 08 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
详解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读取文件并可支持远程文件的代码分享
2012/10/03 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
js href的用法
2010/05/13 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
JavaScript手机振动API
2016/06/11 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
Python中获取对象信息的方法
2015/04/27 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Python进程池Pool应用实例分析
2019/11/27 Python
python可迭代对象去重实例
2020/05/15 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
项目经理岗位职责
2013/11/11 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
学校国庆节活动总结
2015/03/23 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
2016年母亲节寄语
2015/12/04 职场文书
golang import自定义包方式
2021/04/29 Golang
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python