浅谈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 相关文章推荐
广告显示判断
Aug 31 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
js文件Cookie存取值示例代码
Feb 20 Javascript
Three.js学习之网格
Aug 10 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
详解使用jQuery.i18n.properties实现js国际化
May 04 jQuery
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
详解使用JWT实现单点登录(完全跨域方案)
Aug 02 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
解析php中const与define的应用区别
2013/06/18 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
js格式化时间小结
2014/11/03 Javascript
js转html实体的方法
2016/09/27 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
javascript中的面向对象
2017/03/30 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
Python实现图片转字符画的代码实例
2019/02/22 Python
jupyter 导入csv文件方式
2020/04/21 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
函授毕业生自我鉴定
2013/11/06 职场文书
实习单位推荐信范文
2013/11/27 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
保险公司年会主持词
2014/03/22 职场文书
詹天佑教学反思
2014/04/30 职场文书
民间个人借款协议书
2014/09/30 职场文书
2014年终个人总结报告
2015/03/09 职场文书
体育委员竞选稿
2015/11/21 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python