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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。