闭包是可以包含自由(未绑定)变量代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python等语言中都能找到对闭包不同程度的支持。
  闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言这意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,是说这些函数可以存储到变量中、作为参数传递给其他函数,重要的是能够被函数动态地创建和返回。
  首先让我们先来看一下在Javascript中闭包(Closure)
  functiona(){
  vari=0;
  functionb(){
  alert(++i);
  }
  returnb;
  }
  varc=a();
  c();
  这段代码有两个特点:
  1、函数b嵌套在函数a内部;
  2、函数a返回函数b。
  这样在执行完varc=a()后,变量c实际上是指向了函数b,再执行c()后会弹出一个窗口显示i的值(第一次为1)。这段代码其实创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,是说:
  当函数a的内部函数b被函数a外的一个变量引用的时候,创建了一个闭包。
  简而言之,闭包的作用是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
  在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
  那么我们来想象另一种情况,如果a返回的不是函数b,情况完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b会被GC回收。
  闭包的应用场景
  1、保护函数内的变量安全。以开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
  2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
  以上两点是闭包基本的应用场景,很多经典案例都源于此。
  Java语言本身还没有正式支持闭包,但它却允许模拟闭包。可以使用匿名的内部类来实现闭包。可以理解为因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private成员。
  回调函数(callbackFunction),顾名思义,用于回调的函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性:
  1、属于工作流的一个部分;
  2、必须按照工作流指定的调用约定来申明(定义);
  3、他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;
  回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
  java回调机制:
  软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
  同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
  回调:一种双向调用模式,也是说,被调用方在接口被调用时也会调用对方的接口;
  异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
  回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。