? 闭包的概念 闭包是函数式编程中的一个概念,它是指: 局部函数对象引用了一个局部变量,而这个函数对象又被返回到局部变量所在作用域的外部 从而使得在局部变量的作用域外部,仍然可以通过函数对象来使用这个局部变量
? 闭包在Javascript中的实现
function a() {
let x = 0;
function b() {
alert(x)
}
return b;
}
let c = a();
//函数a已经执行完毕,变量x的作用域已经结束,但是仍然可以通过c来使用x
//只有c的作用域结束,变量x占用的资源才可能被回收
c();
? 闭包在Java中的实现 Java不是函数式编程语言,函数无法作为对象返回,但是Java可以返回一个内部类对象 由于内部类中的成员函数可以完成javascript中的函数对象功能,因为可以通过内部类来实现闭包功能
public class Message {
public MessagePrinter getPrinter() {
//由于变量message可能被多个内部类对象访问
//如果其中一个内部类对象修改了message的地址,其它内部类对象便会指向错误地址
//所以被内部类使用的变量应当是final类型的
final String message = String.valueOf(new Random().nextInt(100));
return new MessagePrinter() {
@Override
public void print() {
System.out.println(message);
}
};
}
public interface MessagePrinter {
void print();
}
public static void main(String[] args) {
MessagePrinter messagePrinter = new Message().getPrinter();
//局部变量message在getPrinter执行完后仍然存在
//直到messagePrinter作用域结束后,才有可能被回收
messagePrinter.print();
}
}
? 闭包的意义和注意点
- 闭包在内存中维护了一个匿名变量,每次通过调用内部函数,都可以使用这个匿名变量
- 闭包增强了这个匿名变量的安全性,除了指定的内部函数,其它对象都无法访问到这个对象
- 闭包有一定的内存消耗,不能到处滥用