zoukankan      html  css  js  c++  java
  • js闭包理解

    闭包是js中的一大特色,也是一大难点。简单来说,所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量。

    闭包的三大特点为:

    1、函数嵌套函数

    2、内部函数可以访问外部函数的变量

    3、参数和变量不会被回收。

    举例来说:

    1.  
      function test(){
    2.  
      var a=1;
    3.  
      return function(){
    4.  
      alert(a);
    5.  
      }
    6.  
      }
    7.  
      var try=test();
    8.  
      try();//弹出a的值

    这个例子中,变量a在test方法外部是无法访问的,但test方法里面,嵌套了一个匿名函数,通过return返回,test作用域中的变量a,

    可以在匿名函数中访问。并且当test方法执行后,变量a所占内存并不会释放,以达到嵌套的函数还可以访问的目的。

    闭包的作用在于,可以通过闭包,设计私有变量及方法。

    举例来说:在java中创建perosn类,含有私有变量name。

    1.  
      public class Person{
    2.  
      private String name='wy';
    3.  
      public Person(val){
    4.  
      name=val;
    5.  
      }
    6.  
      public void setName(val){
    7.  
      name=val;
    8.  
      }
    9.  
      public String getName(){
    10.  
      return name;
    11.  
      }
    12.  
      }


    在js中实现类似java创建类的功能:

    1.  
      (function(){
    2.  
      var name="wangyu";
    3.  
      Person=function (val) {
    4.  
      name=val;
    5.  
      }
    6.  
      Person.prototype.setName=function(val){
    7.  
      name=val;
    8.  
      }
    9.  
      Person.prototype.getName=function () {
    10.  
      return name;
    11.  
      }
    12.  
      })();
    13.  
      var person1=new Person("sj");
    14.  
      alert(this.name)//undefined 因为在function作用域外不能访问
    15.  
      alert(person1.getName());//wangyu

    在function里面的name,由于是在function作用域中,所以外部无法访问,但是可以通过创建person对象,调用person的方法,来达到

    修改和访问name值的目的,类似于java类中的私有变量,外部无法访问,只能通过类方法访问。

    再看一个私有变量的例子:

    1.  
      var aaa = (function(){
    2.  
      var a = 1;
    3.  
      function bbb(){
    4.  
      a++;
    5.  
      alert(a);
    6.  
      }
    7.  
      function ccc(){
    8.  
      a++;
    9.  
      alert(a);
    10.  
      }
    11.  
      return {
    12.  
      b:bbb, //json结构
    13.  
      c:ccc
    14.  
      }
    15.  
      })();
    16.  
      alert(aaa.a)//undefined
    17.  
      aaa.b(); //2
    18.  
      aaa.c() //3


    总结:

    1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

    2、不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包
    的体现。
     
  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/exmyth/p/9320498.html
Copyright © 2011-2022 走看看