闭包
闭包是特殊的函数,代码 + 数据绑定在一起,(普通函数只有代码,没有数据,这个数据不是函数的形参,也不是函数内部定义的变量,而是从外部捕获进来),闭包捕获的这些外部数据其实保存在堆上,闭包上下文负责内存管理。
闭包其实就是一个函数对象,也可以类比成一个类的对象,有自己的数据,不是 static 的,不和别的对象共享。
lamda/匿名函数不是闭包,但是因为有了匿名函数,写闭包变的容易了。
闭包的另外一个定义是高阶函数,就是返回值是函数的函数。当内层函数使用了外层函数的临时变量,因为返回值是内层函数,而外层函数里的临时变量也在返回值(也就是内层函数)的里面,所以该临时变量在外层函数执行完毕后并没有释放,而是被捕获进了返回后的内层函数(闭包)的上下文里。
函数式编程
“函数” 是编程语言里的一等“公民”,函数可以赋值给变量,可以做函数的参数,也可以做函数的返回值。
命令式编程
在不支持函数式编程的时候,我们必须显式的调用函数,就像要严格的发布每一条命令。
声明式编程
支持函数式编程后,我们可以提前将函数(也就是某种操作)发送到别的函数或者变量,让它在需要的时候自动的被执行,就像是我们发布了总的方针,具体行动是程序自动执行的。