浅谈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 相关文章推荐
网易JS面试题与Javascript词法作用域说明
Nov 09 Javascript
Javascript面向对象编程
Mar 18 Javascript
通过JS来判断页面控件是否获取焦点
Jan 03 Javascript
JQuery each()嵌套使用小结
Apr 18 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
Mar 04 Javascript
Bootstrap每天必学之按钮(一)
Nov 24 Javascript
javascript字符串函数汇总
Dec 06 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
浅谈js for循环输出i为同一值的问题
Mar 01 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 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
php数组去重复数据示例
2014/02/25 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
matplotlib绘图实例演示标记路径
2018/01/23 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
parser.add_argument中的action使用
2020/04/20 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
学院领导推荐信
2013/10/30 职场文书
医院院务公开实施方案
2014/05/03 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
爱的教育读书笔记
2015/06/26 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
警用民用对讲机找不同
2022/02/18 无线电