浅谈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 作用域使用说明
Aug 13 Javascript
javascript 按回车键相应按钮提交事件
Nov 02 Javascript
jQuery学习笔记之控制页面实现代码
Feb 27 Javascript
JavaScript的Module模式编程深入分析
Aug 13 Javascript
javascript中Math.random()使用详解
Apr 15 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
Bootstrap实现响应式导航栏效果
Dec 28 Javascript
vue2 router 动态传参,多个参数的实例
Nov 10 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
JavaScript使用math.js进行精确计算操作示例
Jun 19 Javascript
插件导致ECharts被全量引入的坑示例解析
Sep 23 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 goto语句简介和使用实例
2014/03/11 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
利用Python开发微信支付的注意事项
2016/08/19 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
将python代码和注释分离的方法
2018/04/21 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python try 异常处理(史上最全)
2019/03/07 Python
Python 函数返回值的示例代码
2019/03/11 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
教师一岗双责责任书
2014/04/16 职场文书
环保志愿者活动方案
2014/08/14 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
七夕情人节问候语
2015/11/11 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书