java有闭包吗,js闭包的理解

  java有闭包吗,js闭包的理解

  本教程运行环境:windows7系统,javascript1.8.5版本1.8.5,戴尔G3电脑。

  一、Javascript中闭包:

  1.变量的作用域

  要理解闭包,我们必须首先理解Javascript的特殊变量作用域。

  变量只有两个范围:全局变量和局部变量。

  Javascript的特殊之处在于可以在函数内部直接读取全局变量。

  var n=999

  函数f1(){

  警报(n);

  }

  f1();//999另一方面,自然不可能在函数外部读取函数内部的局部变量。

  函数f1(){

  var n=999

  }

  警报(n);//错误这里有一点需要注意。在函数内部声明变量时,一定要使用var命令。如果你不使用它,你实际上声明了一个全局变量!

  函数f1(){

  n=999

  }

  f1();

  警报(n);//9992.如何从外部读取局部变量

  由于各种原因,我们有时需要在函数中获取局部变量。但是,如前所述,正常情况下,这是不可能的,只能通过变通方法来实现。

  也就是在函数内部定义另一个函数。

  函数f1(){

  n=999

  函数f2(){

  警报(n);//999

  }

  }由于f2可以读取f1中的局部变量,所以我们只要把f2作为返回值就可以读取它在f1之外的内部变量!

  函数f1(){

  n=999

  函数f2(){

  警报(n);

  }

  返回F2;

  }

  var result=f1();

  结果();//9993.闭包的概念

  上面的f2函数是一个闭包。闭包实际上是定义在函数内部的函数(因为是子函数,所以可以读取父函数的内部变量)。

  本质上,闭包是连接函数内部和外部的桥梁。

  4.闭包的用途

  1.你可以读取函数内部的变量。

  2.让这些变量(闭包引用的变量)的值总是保留在内存中。

  函数f1(){

  var n=999

  nAdd=function(){n=1}

  函数f2(){

  警报(n);

  }

  返回F2;

  }

  var result=f1();

  结果();//999

  nAdd();

  结果();//1000在这段代码中,result实际上是闭包的f2函数。它运行两次,第一次的值是999,第二次的值是1000。这证明函数f1中的局部变量N一直保存在内存中,并没有在调用f1后自动清除。

  为什么会这样?原因是f1是f2的父函数,f2被赋给了一个全局变量,导致f2一直在内存中,f2的存在依赖于f1,所以f1一直在内存中,调用结束后不会被垃圾回收收集。

  这段代码中另一个值得注意的地方是行“nAdd=function(){n=1}”。首先,在nAdd之前没有使用var关键字,所以nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数,匿名函数本身也是一个闭包,所以nAdd相当于一个setter,可以在函数外部操作函数内部的局部变量。

  5.使用闭包的注意点

  1.因为闭包会使函数中的变量存储在内存中,消耗大量内存,所以闭包不能被滥用。

  2.闭包会在父函数之外,改变父函数内部的变量值。

  6.闭包的应用场景

  1.保护函数中的变量。以最初的例子为例。在函数A中,I只能被函数B访问,不能被其他途径访问,从而保护了I的安全性。

  2.在内存中维护一个变量。和前面的例子一样,由于闭包,函数A中的I始终存在于内存中,所以每执行一次C()I就会加1。

  二、Java中的闭包

  1.java中闭包的定义

  定义:一个闭包可以将一个方法存储为一个变量,它有能力访问其类的自由变量。

  Java本身并不正式支持闭包,但是它允许闭包的模拟(内部类接口)。您可以使用匿名内部类来实现闭包。

  这个普通对象如何访问其类的自由变量?班级。内部类可以访问外部类的所有属性和方法。

  隐藏具体的实现是内部类的功能之一。如何在隐藏具体实现的同时,保证闭包可以传递给外部使用?让内部类实现通用接口,然后把内部类对象转换成接口类型。

  2.简单的代码实现:

  最终静态字符串name=纯牛奶;//名称

  私有静态int num=16//数量

  公共牛奶(){

  system . out . println(name :16/每盒);

  }

  /**

  *关闭

  *

  * @return返回一个喝奶的动作。

  */

  公共活动HaveMeals() {

  返回新的Active() {

  公共无效饮料(){

  if (num==0) {

  system . out . println(‘没有木头,都是你丫完成的。’);

  返回;

  }

  num-;

  System.out.println(喝一瓶牛奶);

  }

  };

  }

  /**

  *获取剩余数量。

  */

  公共void currentNum() {

  System.out.println(名称剩余:数量);

  }

  }

  /**

  *通用接口

  */

  接口活动{

  虚空饮();

  }

  //闭包的使用

  公共类人员{

  公共静态void main(String[] args) {

  //买一盒牛奶

  牛奶m=新牛奶();

  active have meals=m . have meals();

  //没事就喝一瓶。

  have meals . drink();

  //有需要就喝一瓶。

  have meals . drink();

  //看看还剩几个?

  m . current num();

  }

  }总结:

  1.闭包很少在实际项目中使用,所以无法评论其质量。

  2.建议合理使用闭包,不要完全使用,更不要滥用。

  3.特别说明:关闭会导致资源无法回收。比如main方法中,m设置为null,用haveMeals继续调用饮料方法,还是会喝到一瓶牛奶,说明牛奶对象没有被释放。

  【推荐学习:javascript高级教程】以上是java和JavaScript闭包区别的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: