浅谈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应用于login页面的问题及解决
Oct 17 Javascript
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
json数据处理及数据绑定
Jan 25 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
使用vue重构资讯页面的实例代码解析
Nov 26 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 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调用三种数据库的方法(2)
2006/10/09 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
python识别验证码图片实例详解
2020/02/17 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
简述数组与指针的区别
2014/01/02 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
自我评价是什么
2014/01/04 职场文书
房屋委托书范本
2014/04/04 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
老公保证书范文
2014/04/29 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
实习生个人总结范文
2015/02/28 职场文书
2015年电教工作总结
2015/05/26 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python