回调与闭包
1、回调函数
一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
在JS中,可以理解为函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。而Ajax的异步加载时用到了回调函数的,但其实回调不仅仅是用在异步中,同步操作也可以使用:

异步的情况也很多:

2、闭包
1)什么是闭包?
能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成一个“定义在函数内部的函数”。创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。
Javascript 中,每个函数都有一个与之相关联的作用域链。每次调用 JavaScript函数的时候,都会为之创建一个新的对象用来保存局部变量,并把这个对象添加至作用域链中。当函数返回时,再将这个对象删除,此对象会被当做垃圾回收。但如果这个函数定义了嵌套的函数,并将它存储在某处的属性里,就意味着有了一个外部引用指向这个嵌套的函数。它就不会被当作垃圾回收,它所指向的变量绑定对象同样不会被回收。
2)闭包特性
a、函数嵌套函数
b、.函数内部可以引用外部的参数和变量
c、参数和变量不会被垃圾回收机制回收
3)例子

foo函数中形成了一个闭包,只要bar函数在,垃圾回收机制就不会去动foo函数,而此时,我们的bar函数所指向的那个匿名函数就可以一直去访问那个number和x,而且每次调用,都会得到上一次被自增了以后的number。